######## snakemake preamble start (automatically inserted, do not edit) ########
import sys; sys.path.extend(['/home/ckikawa/.conda/envs/seqneut-pipeline/lib/python3.11/site-packages', '/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/seqneut-pipeline', '/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024', '/home/ckikawa/.conda/envs/seqneut-pipeline/bin', '/home/ckikawa/.conda/envs/seqneut-pipeline/lib/python3.11', '/home/ckikawa/.conda/envs/seqneut-pipeline/lib/python3.11/lib-dynload', '/home/ckikawa/.local/lib/python3.11/site-packages', '/home/ckikawa/.conda/envs/seqneut-pipeline/lib/python3.11/site-packages', '/home/ckikawa/.cache/snakemake/snakemake/source-cache/runtime-cache/tmpy6xj203u/file/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/seqneut-pipeline/notebooks', '/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/seqneut-pipeline/notebooks']); import pickle; snakemake = pickle.loads(b'\x80\x04\x95\x9b\x83\x00\x00\x00\x00\x00\x00\x8c\x10snakemake.script\x94\x8c\tSnakemake\x94\x93\x94)\x81\x94}\x94(\x8c\x05input\x94\x8c\x0csnakemake.io\x94\x8c\nInputFiles\x94\x93\x94)\x81\x94(\x8c7results/barcode_counts/plate6_A230212d0_rd256_100.0.csv\x94\x8c7results/barcode_counts/plate6_A230212d0_rd256_150.0.csv\x94\x8c7results/barcode_counts/plate6_A230212d0_rd256_225.0.csv\x94\x8c7results/barcode_counts/plate6_A230212d0_rd256_337.5.csv\x94\x8c8results/barcode_counts/plate6_A230212d0_rd256_506.25.csv\x94\x8c9results/barcode_counts/plate6_A230212d0_rd256_759.375.csv\x94\x8c;results/barcode_counts/plate6_A230212d0_rd256_1139.0625.csv\x94\x8c<results/barcode_counts/plate6_A230212d0_rd256_1708.59375.csv\x94\x8c=results/barcode_counts/plate6_A230212d0_rd256_2562.890625.csv\x94\x8c=results/barcode_counts/plate6_A230212d0_rd256_3844.335938.csv\x94\x8c=results/barcode_counts/plate6_A230212d0_rd256_5766.503906.csv\x94\x8c(results/barcode_counts/plate6_none-1.csv\x94\x8c8results/barcode_counts/plate6_A230212d28_rd256_100.0.csv\x94\x8c8results/barcode_counts/plate6_A230212d28_rd256_150.0.csv\x94\x8c8results/barcode_counts/plate6_A230212d28_rd256_225.0.csv\x94\x8c8results/barcode_counts/plate6_A230212d28_rd256_337.5.csv\x94\x8c9results/barcode_counts/plate6_A230212d28_rd256_506.25.csv\x94\x8c:results/barcode_counts/plate6_A230212d28_rd256_759.375.csv\x94\x8c<results/barcode_counts/plate6_A230212d28_rd256_1139.0625.csv\x94\x8c=results/barcode_counts/plate6_A230212d28_rd256_1708.59375.csv\x94\x8c>results/barcode_counts/plate6_A230212d28_rd256_2562.890625.csv\x94\x8c>results/barcode_counts/plate6_A230212d28_rd256_3844.335938.csv\x94\x8c>results/barcode_counts/plate6_A230212d28_rd256_5766.503906.csv\x94\x8c(results/barcode_counts/plate6_none-2.csv\x94\x8c6results/barcode_fates/plate6_A230212d0_rd256_100.0.csv\x94\x8c6results/barcode_fates/plate6_A230212d0_rd256_150.0.csv\x94\x8c6results/barcode_fates/plate6_A230212d0_rd256_225.0.csv\x94\x8c6results/barcode_fates/plate6_A230212d0_rd256_337.5.csv\x94\x8c7results/barcode_fates/plate6_A230212d0_rd256_506.25.csv\x94\x8c8results/barcode_fates/plate6_A230212d0_rd256_759.375.csv\x94\x8c:results/barcode_fates/plate6_A230212d0_rd256_1139.0625.csv\x94\x8c;results/barcode_fates/plate6_A230212d0_rd256_1708.59375.csv\x94\x8c<results/barcode_fates/plate6_A230212d0_rd256_2562.890625.csv\x94\x8c<results/barcode_fates/plate6_A230212d0_rd256_3844.335938.csv\x94\x8c<results/barcode_fates/plate6_A230212d0_rd256_5766.503906.csv\x94\x8c\'results/barcode_fates/plate6_none-1.csv\x94\x8c7results/barcode_fates/plate6_A230212d28_rd256_100.0.csv\x94\x8c7results/barcode_fates/plate6_A230212d28_rd256_150.0.csv\x94\x8c7results/barcode_fates/plate6_A230212d28_rd256_225.0.csv\x94\x8c7results/barcode_fates/plate6_A230212d28_rd256_337.5.csv\x94\x8c8results/barcode_fates/plate6_A230212d28_rd256_506.25.csv\x94\x8c9results/barcode_fates/plate6_A230212d28_rd256_759.375.csv\x94\x8c;results/barcode_fates/plate6_A230212d28_rd256_1139.0625.csv\x94\x8c<results/barcode_fates/plate6_A230212d28_rd256_1708.59375.csv\x94\x8c=results/barcode_fates/plate6_A230212d28_rd256_2562.890625.csv\x94\x8c=results/barcode_fates/plate6_A230212d28_rd256_3844.335938.csv\x94\x8c=results/barcode_fates/plate6_A230212d28_rd256_5766.503906.csv\x94\x8c\'results/barcode_fates/plate6_none-2.csv\x94\x8c)data/viral_libraries/2023_H3N2_Kikawa.csv\x94\x8c3data/neut_standard_sets/loes2023_neut_standards.csv\x94e}\x94(\x8c\x06_names\x94}\x94(\x8c\ncount_csvs\x94K\x00K\x18\x86\x94\x8c\tfate_csvs\x94K\x18K0\x86\x94\x8c\x11viral_library_csv\x94K0N\x86\x94\x8c\x15neut_standard_set_csv\x94K1N\x86\x94u\x8c\x12_allowed_overrides\x94]\x94(\x8c\x05index\x94\x8c\x04sort\x94ehI\x8c\tfunctools\x94\x8c\x07partial\x94\x93\x94h\x06\x8c\x19Namedlist._used_attribute\x94\x93\x94\x85\x94R\x94(hO)}\x94\x8c\x05_name\x94hIsNt\x94bhJhMhO\x85\x94R\x94(hO)}\x94hShJsNt\x94bh?h\x06\x8c\tNamedlist\x94\x93\x94)\x81\x94(h\nh\x0bh\x0ch\rh\x0eh\x0fh\x10h\x11h\x12h\x13h\x14h\x15h\x16h\x17h\x18h\x19h\x1ah\x1bh\x1ch\x1dh\x1eh\x1fh h!e}\x94(h=}\x94hG]\x94(hIhJehIhMhO\x85\x94R\x94(hO)}\x94hShIsNt\x94bhJhMhO\x85\x94R\x94(hO)}\x94hShJsNt\x94bubhAhZ)\x81\x94(h"h#h$h%h&h\'h(h)h*h+h,h-h.h/h0h1h2h3h4h5h6h7h8h9e}\x94(h=}\x94hG]\x94(hIhJehIhMhO\x85\x94R\x94(hO)}\x94hShIsNt\x94bhJhMhO\x85\x94R\x94(hO)}\x94hShJsNt\x94bubhCh:hEh;ub\x8c\x06output\x94h\x06\x8c\x0bOutputFiles\x94\x93\x94)\x81\x94(\x8c"results/plates/plate6/qc_drops.yml\x94\x8c*results/plates/plate6/frac_infectivity.csv\x94\x8c#results/plates/plate6/curvefits.csv\x94\x8c&results/plates/plate6/curvefits.pickle\x94e}\x94(h=}\x94(\x8c\x08qc_drops\x94K\x00N\x86\x94\x8c\x14frac_infectivity_csv\x94K\x01N\x86\x94\x8c\x08fits_csv\x94K\x02N\x86\x94\x8c\x0bfits_pickle\x94K\x03N\x86\x94uhG]\x94(hIhJehIhMhO\x85\x94R\x94(hO)}\x94hShIsNt\x94bhJhMhO\x85\x94R\x94(hO)}\x94hShJsNt\x94bh}hwh\x7fhxh\x81hyh\x83hzub\x8c\x06params\x94h\x06\x8c\x06Params\x94\x93\x94)\x81\x94(]\x94(\x8c\x1cplate6_A230212d0_rd256_100.0\x94\x8c\x1cplate6_A230212d0_rd256_150.0\x94\x8c\x1cplate6_A230212d0_rd256_225.0\x94\x8c\x1cplate6_A230212d0_rd256_337.5\x94\x8c\x1dplate6_A230212d0_rd256_506.25\x94\x8c\x1eplate6_A230212d0_rd256_759.375\x94\x8c plate6_A230212d0_rd256_1139.0625\x94\x8c!plate6_A230212d0_rd256_1708.59375\x94\x8c"plate6_A230212d0_rd256_2562.890625\x94\x8c"plate6_A230212d0_rd256_3844.335938\x94\x8c"plate6_A230212d0_rd256_5766.503906\x94\x8c\rplate6_none-1\x94\x8c\x1dplate6_A230212d28_rd256_100.0\x94\x8c\x1dplate6_A230212d28_rd256_150.0\x94\x8c\x1dplate6_A230212d28_rd256_225.0\x94\x8c\x1dplate6_A230212d28_rd256_337.5\x94\x8c\x1eplate6_A230212d28_rd256_506.25\x94\x8c\x1fplate6_A230212d28_rd256_759.375\x94\x8c!plate6_A230212d28_rd256_1139.0625\x94\x8c"plate6_A230212d28_rd256_1708.59375\x94\x8c#plate6_A230212d28_rd256_2562.890625\x94\x8c#plate6_A230212d28_rd256_3844.335938\x94\x8c#plate6_A230212d28_rd256_5766.503906\x94\x8c\rplate6_none-2\x94e}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94\x8c\n2024-02-07\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c.data/plates/2024-02-07_plate_mapping_file5.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(\x8c\x1bavg_barcode_counts_per_well\x94M\xf4\x01\x8c\x1fmin_neut_standard_frac_per_well\x94G?tz\xe1G\xae\x14{\x8c"no_serum_per_viral_barcode_filters\x94}\x94(\x8c\x08min_frac\x94G?\x1a6\xe2\xeb\x1cC-\x8c\x0fmax_fold_change\x94K\x04\x8c\tmax_wells\x94K\x02u\x8c!per_neut_standard_barcode_filters\x94}\x94(\x8c\x08min_frac\x94G?tz\xe1G\xae\x14{\x8c\x0fmax_fold_change\x94K\x04\x8c\tmax_wells\x94K\x02u\x8c min_neut_standard_count_per_well\x94M\xe8\x03\x8c)min_no_serum_count_per_viral_barcode_well\x94Kd\x8c+max_frac_infectivity_per_viral_barcode_well\x94K\x03\x8c)min_dilutions_per_barcode_serum_replicate\x94K\x06u\x8c\x0fcurvefit_params\x94}\x94(\x8c\x18frac_infectivity_ceiling\x94K\x01\x8c\x06fixtop\x94]\x94(G?\xe3333333K\x01e\x8c\tfixbottom\x94K\x00\x8c\x08fixslope\x94]\x94(G?\xe9\x99\x99\x99\x99\x99\x9aK\neu\x8c\x0bcurvefit_qc\x94}\x94(\x8c\x1dmax_frac_infectivity_at_least\x94G\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x0fgoodness_of_fit\x94}\x94(\x8c\x06min_R2\x94G?\xe0\x00\x00\x00\x00\x00\x00\x8c\x08max_RMSD\x94G?\xc3333333u\x8c#serum_replicates_ignore_curvefit_qc\x94]\x94\x8c+barcode_serum_replicates_ignore_curvefit_qc\x94]\x94u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\x08upstream\x94\x8c\x1cCCTACAATGTCGGATTTGTATTTAATAG\x94\x8c\ndownstream\x94\x8c\x00\x94\x8c\x04minq\x94K\x14\x8c\x11upstream_mismatch\x94K\x04\x8c\x0ebc_orientation\x94\x8c\x02R2\x94u\x8c\x07samples\x94}\x94(\x8c\x04well\x94}\x94(K\x00\x8c\x02C1\x94K\x01\x8c\x02C2\x94K\x02\x8c\x02C3\x94K\x03\x8c\x02C4\x94K\x04\x8c\x02C5\x94K\x05\x8c\x02C6\x94K\x06\x8c\x02C7\x94K\x07\x8c\x02C8\x94K\x08\x8c\x02C9\x94K\t\x8c\x03C10\x94K\n\x8c\x03C11\x94K\x0b\x8c\x03C12\x94K\x0c\x8c\x02G1\x94K\r\x8c\x02G2\x94K\x0e\x8c\x02G3\x94K\x0f\x8c\x02G4\x94K\x10\x8c\x02G5\x94K\x11\x8c\x02G6\x94K\x12\x8c\x02G7\x94K\x13\x8c\x02G8\x94K\x14\x8c\x02G9\x94K\x15\x8c\x03G10\x94K\x16\x8c\x03G11\x94K\x17\x8c\x03G12\x94u\x8c\x05serum\x94}\x94(K\x00\x8c\x0fA230212d0_rd256\x94K\x01j\x05\x01\x00\x00K\x02j\x05\x01\x00\x00K\x03j\x05\x01\x00\x00K\x04j\x05\x01\x00\x00K\x05j\x05\x01\x00\x00K\x06j\x05\x01\x00\x00K\x07j\x05\x01\x00\x00K\x08j\x05\x01\x00\x00K\tj\x05\x01\x00\x00K\nj\x05\x01\x00\x00K\x0b\x8c\x04none\x94K\x0c\x8c\x10A230212d28_rd256\x94K\rj\x07\x01\x00\x00K\x0ej\x07\x01\x00\x00K\x0fj\x07\x01\x00\x00K\x10j\x07\x01\x00\x00K\x11j\x07\x01\x00\x00K\x12j\x07\x01\x00\x00K\x13j\x07\x01\x00\x00K\x14j\x07\x01\x00\x00K\x15j\x07\x01\x00\x00K\x16j\x07\x01\x00\x00K\x17j\x06\x01\x00\x00u\x8c\x0fdilution_factor\x94}\x94(K\x00G@Y\x00\x00\x00\x00\x00\x00K\x01G@b\xc0\x00\x00\x00\x00\x00K\x02G@l \x00\x00\x00\x00\x00K\x03G@u\x18\x00\x00\x00\x00\x00K\x04G@\x7f\xa4\x00\x00\x00\x00\x00K\x05G@\x87\xbb\x00\x00\x00\x00\x00K\x06G@\x91\xcc@\x00\x00\x00\x00K\x07G@\x9a\xb2`\x00\x00\x00\x00K\x08G@\xa4\x05\xc8\x00\x00\x00\x00K\tG@\xae\x08\xac\x00\x10\xc6\xf8K\nG@\xb6\x86\x80\xff\xfb\xceBK\x0bG\x7f\xf8\x00\x00\x00\x00\x00\x00K\x0cG@Y\x00\x00\x00\x00\x00\x00K\rG@b\xc0\x00\x00\x00\x00\x00K\x0eG@l \x00\x00\x00\x00\x00K\x0fG@u\x18\x00\x00\x00\x00\x00K\x10G@\x7f\xa4\x00\x00\x00\x00\x00K\x11G@\x87\xbb\x00\x00\x00\x00\x00K\x12G@\x91\xcc@\x00\x00\x00\x00K\x13G@\x9a\xb2`\x00\x00\x00\x00K\x14G@\xa4\x05\xc8\x00\x00\x00\x00K\x15G@\xae\x08\xac\x00\x10\xc6\xf8K\x16G@\xb6\x86\x80\xff\xfb\xceBK\x17G\x7f\xf8\x00\x00\x00\x00\x00\x00u\x8c\treplicate\x94}\x94(K\x00K\x01K\x01K\x01K\x02K\x01K\x03K\x01K\x04K\x01K\x05K\x01K\x06K\x01K\x07K\x01K\x08K\x01K\tK\x01K\nK\x01K\x0bK\x01K\x0cK\x01K\rK\x01K\x0eK\x01K\x0fK\x01K\x10K\x01K\x11K\x01K\x12K\x01K\x13K\x01K\x14K\x01K\x15K\x01K\x16K\x01K\x17K\x02u\x8c\x05fastq\x94}\x94(K\x00\x8c\x8d/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d0_conc1_S3_R1_001.fastq.gz\x94K\x01\x8c\x8e/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d0_conc2_S11_R1_001.fastq.gz\x94K\x02\x8c\x8e/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d0_conc3_S19_R1_001.fastq.gz\x94K\x03\x8c\x8e/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d0_conc4_S27_R1_001.fastq.gz\x94K\x04\x8c\x8e/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d0_conc5_S35_R1_001.fastq.gz\x94K\x05\x8c\x8e/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d0_conc6_S43_R1_001.fastq.gz\x94K\x06\x8c\x8e/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d0_conc7_S51_R1_001.fastq.gz\x94K\x07\x8c\x8e/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d0_conc8_S59_R1_001.fastq.gz\x94K\x08\x8c\x8e/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d0_conc9_S67_R1_001.fastq.gz\x94K\t\x8c\x8f/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d0_conc10_S75_R1_001.fastq.gz\x94K\n\x8c\x8f/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d0_conc11_S83_R1_001.fastq.gz\x94K\x0b\x8c\x90/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d0_noSerum_S91_R1_001.fastq.gz\x94K\x0c\x8c\x8e/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d28_conc1_S7_R1_001.fastq.gz\x94K\r\x8c\x8f/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d28_conc2_S15_R1_001.fastq.gz\x94K\x0e\x8c\x8f/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d28_conc3_S23_R1_001.fastq.gz\x94K\x0f\x8c\x8f/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d28_conc4_S31_R1_001.fastq.gz\x94K\x10\x8c\x8f/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d28_conc5_S39_R1_001.fastq.gz\x94K\x11\x8c\x8f/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d28_conc6_S47_R1_001.fastq.gz\x94K\x12\x8c\x8f/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d28_conc7_S55_R1_001.fastq.gz\x94K\x13\x8c\x8f/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d28_conc8_S63_R1_001.fastq.gz\x94K\x14\x8c\x8f/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d28_conc9_S71_R1_001.fastq.gz\x94K\x15\x8c\x90/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d28_conc10_S79_R1_001.fastq.gz\x94K\x16\x8c\x90/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d28_conc11_S87_R1_001.fastq.gz\x94K\x17\x8c\x91/fh/fast/bloom_j/SR/ngs/illumina/bloom_lab/240206_VH00699_434_AAFGTH5M5/Unaligned/Project_bloom_lab/rd256_A230212_d28_noSerum_S95_R1_001.fastq.gz\x94u\x8c\x0fserum_replicate\x94}\x94(K\x00j\x05\x01\x00\x00K\x01j\x05\x01\x00\x00K\x02j\x05\x01\x00\x00K\x03j\x05\x01\x00\x00K\x04j\x05\x01\x00\x00K\x05j\x05\x01\x00\x00K\x06j\x05\x01\x00\x00K\x07j\x05\x01\x00\x00K\x08j\x05\x01\x00\x00K\tj\x05\x01\x00\x00K\nj\x05\x01\x00\x00K\x0b\x8c\x06none-1\x94K\x0cj\x07\x01\x00\x00K\rj\x07\x01\x00\x00K\x0ej\x07\x01\x00\x00K\x0fj\x07\x01\x00\x00K\x10j\x07\x01\x00\x00K\x11j\x07\x01\x00\x00K\x12j\x07\x01\x00\x00K\x13j\x07\x01\x00\x00K\x14j\x07\x01\x00\x00K\x15j\x07\x01\x00\x00K\x16j\x07\x01\x00\x00K\x17\x8c\x06none-2\x94u\x8c\x0esample_noplate\x94}\x94(K\x00\x8c\x15A230212d0_rd256_100.0\x94K\x01\x8c\x15A230212d0_rd256_150.0\x94K\x02\x8c\x15A230212d0_rd256_225.0\x94K\x03\x8c\x15A230212d0_rd256_337.5\x94K\x04\x8c\x16A230212d0_rd256_506.25\x94K\x05\x8c\x17A230212d0_rd256_759.375\x94K\x06\x8c\x19A230212d0_rd256_1139.0625\x94K\x07\x8c\x1aA230212d0_rd256_1708.59375\x94K\x08\x8c\x1bA230212d0_rd256_2562.890625\x94K\t\x8c\x1bA230212d0_rd256_3844.335938\x94K\n\x8c\x1bA230212d0_rd256_5766.503906\x94K\x0bj(\x01\x00\x00K\x0c\x8c\x16A230212d28_rd256_100.0\x94K\r\x8c\x16A230212d28_rd256_150.0\x94K\x0e\x8c\x16A230212d28_rd256_225.0\x94K\x0f\x8c\x16A230212d28_rd256_337.5\x94K\x10\x8c\x17A230212d28_rd256_506.25\x94K\x11\x8c\x18A230212d28_rd256_759.375\x94K\x12\x8c\x1aA230212d28_rd256_1139.0625\x94K\x13\x8c\x1bA230212d28_rd256_1708.59375\x94K\x14\x8c\x1cA230212d28_rd256_2562.890625\x94K\x15\x8c\x1cA230212d28_rd256_3844.335938\x94K\x16\x8c\x1cA230212d28_rd256_5766.503906\x94K\x17j)\x01\x00\x00u\x8c\x06sample\x94}\x94(K\x00h\x93K\x01h\x94K\x02h\x95K\x03h\x96K\x04h\x97K\x05h\x98K\x06h\x99K\x07h\x9aK\x08h\x9bK\th\x9cK\nh\x9dK\x0bh\x9eK\x0ch\x9fK\rh\xa0K\x0eh\xa1K\x0fh\xa2K\x10h\xa3K\x11h\xa4K\x12h\xa5K\x13h\xa6K\x14h\xa7K\x15h\xa8K\x16h\xa9K\x17h\xaau\x8c\x05plate\x94}\x94(K\x00\x8c\x06plate6\x94K\x01jF\x01\x00\x00K\x02jF\x01\x00\x00K\x03jF\x01\x00\x00K\x04jF\x01\x00\x00K\x05jF\x01\x00\x00K\x06jF\x01\x00\x00K\x07jF\x01\x00\x00K\x08jF\x01\x00\x00K\tjF\x01\x00\x00K\njF\x01\x00\x00K\x0bjF\x01\x00\x00K\x0cjF\x01\x00\x00K\rjF\x01\x00\x00K\x0ejF\x01\x00\x00K\x0fjF\x01\x00\x00K\x10jF\x01\x00\x00K\x11jF\x01\x00\x00K\x12jF\x01\x00\x00K\x13jF\x01\x00\x00K\x14jF\x01\x00\x00K\x15jF\x01\x00\x00K\x16jF\x01\x00\x00K\x17jF\x01\x00\x00u\x8c\x0fplate_replicate\x94}\x94(K\x00jF\x01\x00\x00K\x01jF\x01\x00\x00K\x02jF\x01\x00\x00K\x03jF\x01\x00\x00K\x04jF\x01\x00\x00K\x05jF\x01\x00\x00K\x06jF\x01\x00\x00K\x07jF\x01\x00\x00K\x08jF\x01\x00\x00K\tjF\x01\x00\x00K\njF\x01\x00\x00K\x0b\x8c\x08plate6-1\x94K\x0cjF\x01\x00\x00K\rjF\x01\x00\x00K\x0ejF\x01\x00\x00K\x0fjF\x01\x00\x00K\x10jF\x01\x00\x00K\x11jF\x01\x00\x00K\x12jF\x01\x00\x00K\x13jF\x01\x00\x00K\x14jF\x01\x00\x00K\x15jF\x01\x00\x00K\x16jF\x01\x00\x00K\x17\x8c\x08plate6-2\x94uuue}\x94(h=}\x94(h\xe7K\x00N\x86\x94\x8c\x0cplate_params\x94K\x01N\x86\x94uhG]\x94(hIhJehIhMhO\x85\x94R\x94(hO)}\x94hShIsNt\x94bhJhMhO\x85\x94R\x94(hO)}\x94hShJsNt\x94bh\xe7h\x92jN\x01\x00\x00h\xabub\x8c\twildcards\x94h\x06\x8c\tWildcards\x94\x93\x94)\x81\x94\x8c\x06plate6\x94a}\x94(h=}\x94\x8c\x05plate\x94K\x00N\x86\x94shG]\x94(hIhJehIhMhO\x85\x94R\x94(hO)}\x94hShIsNt\x94bhJhMhO\x85\x94R\x94(hO)}\x94hShJsNt\x94bjD\x01\x00\x00j]\x01\x00\x00ub\x8c\x07threads\x94K\x01\x8c\tresources\x94h\x06\x8c\tResources\x94\x93\x94)\x81\x94(K\x01K\x01\x8c\x15/loc/scratch/64245082\x94e}\x94(h=}\x94(\x8c\x06_cores\x94K\x00N\x86\x94\x8c\x06_nodes\x94K\x01N\x86\x94\x8c\x06tmpdir\x94K\x02N\x86\x94uhG]\x94(hIhJehIhMhO\x85\x94R\x94(hO)}\x94hShIsNt\x94bhJhMhO\x85\x94R\x94(hO)}\x94hShJsNt\x94bjs\x01\x00\x00K\x01ju\x01\x00\x00K\x01jw\x01\x00\x00jp\x01\x00\x00ub\x8c\x03log\x94h\x06\x8c\x03Log\x94\x93\x94)\x81\x94\x8c*results/plates/plate6/process_plate6.ipynb\x94a}\x94(h=}\x94\x8c\x08notebook\x94K\x00N\x86\x94shG]\x94(hIhJehIhMhO\x85\x94R\x94(hO)}\x94hShIsNt\x94bhJhMhO\x85\x94R\x94(hO)}\x94hShJsNt\x94bj\x89\x01\x00\x00j\x86\x01\x00\x00ub\x8c\x06config\x94}\x94(\x8c\x10seqneut-pipeline\x94\x8c\x10seqneut-pipeline\x94\x8c\x04docs\x94\x8c\x04docs\x94\x8c\x0bdescription\x94X\n\x01\x00\x00# Sequencing-based neutralization assays of 2023-2024 human serum samples versus H3N2 influenza libraries\n\nThe numerical data and computer code are at [https://github.com/jbloomlab/flu_seqneut_H3N2_2023-2024](https://github.com/jbloomlab/flu_seqneut_H3N2_2023-2024)\n\x94\x8c\x0fviral_libraries\x94}\x94(\x8c\x0cH3N2_library\x94\x8c)data/viral_libraries/2023_H3N2_Kikawa.csv\x94\x8c\x0cH1N1_library\x94\x8c-data/viral_libraries/pdmH1N1_lib2023_loes.csv\x94u\x8c\x17viral_strain_plot_order\x94\x8c)data/H3N2library_2023-2024_allStrains.csv\x94\x8c\x12neut_standard_sets\x94}\x94\x8c\x08loes2023\x94\x8c3data/neut_standard_sets/loes2023_neut_standards.csv\x94s\x8c\x1eillumina_barcode_parser_params\x94}\x94(h\xdfh\xe0h\xe1h\xe2h\xe3K\x14h\xe4K\x04h\xe5h\xe6u\x8c#default_process_plate_qc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c%default_process_plate_curvefit_params\x94}\x94(h\xccK\x01h\xcd]\x94(G?\xe3333333K\x01eh\xcfK\x00h\xd0]\x94(G?\xe9\x99\x99\x99\x99\x99\x9aK\neu\x8c!default_process_plate_curvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9]\x94h\xdb]\x94u\x8c\x16default_serum_titer_as\x94\x8c\x08midpoint\x94\x8c\x1bdefault_serum_qc_thresholds\x94}\x94(\x8c\x0emin_replicates\x94K\x02\x8c\x1bmax_fold_change_from_median\x94K\x06\x8c\x11viruses_ignore_qc\x94]\x94u\x8c\x16sera_override_defaults\x94}\x94\x8c\x06plates\x94}\x94(\x8c\x06plate1\x94}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94\x8c\x08datetime\x94\x8c\x04date\x94\x93\x94C\x04\x07\xe8\x01\x19\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c.data/plates/2024-01-22_plate_mapping_file2.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x06plate2\x94}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x01\x19\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c.data/plates/2024-01-22_plate_mapping_file1.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x06plate3\x94}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x01\x19\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c.data/plates/2024-01-22_plate_mapping_file3.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x18barcode_serum_replicates\x94]\x94(]\x94(\x8c\x10AATGACAGCTGTCTAG\x94\x8c\x12A230212d0_r64_rep1\x94e]\x94(\x8c\x10ATAGAAAATTATCCGC\x94\x8c\x12A230212d0_r64_rep1\x94ees\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x06plate4\x94}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x02\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c.data/plates/2024-02-07_plate_mapping_file7.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x06plate5\x94}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x02\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c.data/plates/2024-02-07_plate_mapping_file4.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uujF\x01\x00\x00}\x94(h\xach\xadh\xaej\xca\x01\x00\x00C\x04\x07\xe8\x02\x07\x94\x85\x94R\x94h\xb0h\xb1h\xb2h\xb3h\xb4h\xb5h\xb6}\x94h\xb8}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06uh\xca}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00uh\xd2}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x06plate7\x94}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x02\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c.data/plates/2024-02-07_plate_mapping_file6.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x0eplate8_r32_50k\x94}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x03\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-03-04_plate_mapping_file10.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x0eplate9_r64_50k\x94}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x03\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-03-04_plate_mapping_file12.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x10plate10_r128_50k\x94}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x03\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c.data/plates/2024-03-04_plate_mapping_file8.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x0fplate11_r32_75k\x94}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x03\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-03-04_plate_mapping_file11.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x0fplate12_r64_75k\x94}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x03\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-03-04_plate_mapping_file13.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x10plate13_r128_75k\x94}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x03\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c.data/plates/2024-03-04_plate_mapping_file9.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x07plate14\x94}\x94(\x8c\x05group\x94\x8c\x0eplatesToRepeat\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x03\x13\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-03-19_plate_mapping_file14.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rbarcode_wells\x94]\x94(]\x94(\x8c\x10AAGTATTGCTACACAT\x94\x8c\x02H3\x94e]\x94(\x8c\x10CCTATAAGGCCTTACG\x94\x8c\x02H3\x94ees\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x07plate15\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x03\x1c\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-03-28_plate_mapping_file15.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x07plate16\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x04\t\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-04-09_plate_mapping_file16.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x07plate17\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x04\x0b\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-04-11_plate_mapping_file17.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x05wells\x94]\x94\x8c\x02A9\x94as\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x07plate18\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x04\x0b\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-04-11_plate_mapping_file18.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x0cplate19_100k\x94}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x04\x10\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-04-23_plate_mapping_file21.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x0cplate20_150k\x94}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x04\x10\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-04-23_plate_mapping_file22.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x0cplate21_200k\x94}\x94(\x8c\x05group\x94\x8c\x05pilot\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x04\x10\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-04-23_plate_mapping_file23.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x07plate22\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x04\x12\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-04-18_plate_mapping_file19.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate23\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x04\x12\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-04-18_plate_mapping_file20.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate24\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x05\x02\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-05-02_plate_mapping_file24.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00uu\x8c\x07plate25\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x05\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-05-20_plate_mapping_file27.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate26\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x05\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-05-20_plate_mapping_file28.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate27\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x05\x11\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-05-17_plate_mapping_file26.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?PbM\xd2\xf1\xa9\xfch\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate28\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x05\x11\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-05-17_plate_mapping_file25.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?PbM\xd2\xf1\xa9\xfch\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate29\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x05\x1c\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-05-28_plate_mapping_file30.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate30\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x05\x1c\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-05-28_plate_mapping_file29.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate31\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x05\x1e\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-05-30_plate_mapping_file31.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate32\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x05\x1e\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-05-30_plate_mapping_file32.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x08barcodes\x94]\x94\x8c\x10CCAATCCCAGCCTTTA\x94as\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate33\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x06\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-06-04_plate_mapping_file34.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate34\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x06\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-06-04_plate_mapping_file33.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate35\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x06\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-07-02_plate_mapping_file36.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate36\x94}\x94(\x8c\x05group\x94\x8c\x03SCH\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x05\x1e\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-07-02_plate_mapping_file35.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate37\x94}\x94(\x8c\x05group\x94\x8c\x11MA22VaccineCohort\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\t\x18\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-09-24_plate_mapping_file37.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate38\x94}\x94(\x8c\x05group\x94\x8c\nPooledSera\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\t\x18\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-09-24_plate_mapping_file38.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate39\x94}\x94(\x8c\x05group\x94\x8c\nPooledSera\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\t\x19\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-09-25_plate_mapping_file40.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate40\x94}\x94(\x8c\x05group\x94\x8c\x11MA22VaccineCohort\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\t\x19\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-09-25_plate_mapping_file41.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x05wells\x94]\x94(\x8c\x03C10\x94\x8c\x03C11\x94es\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate41\x94}\x94(\x8c\x05group\x94\x8c\x11MA22VaccineCohort\x94\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\t\x19\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c/data/plates/2024-09-25_plate_mapping_file39.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(h\xbaM\xf4\x01h\xbbG?tz\xe1G\xae\x14{h\xbc}\x94(h\xbeG?\x1a6\xe2\xeb\x1cC-h\xbfK\x04h\xc0K\x02uh\xc1}\x94(h\xc3G?tz\xe1G\xae\x14{h\xc4K\x04h\xc5K\x02uh\xc6M\xe8\x03h\xc7Kdh\xc8K\x03h\xc9K\x06u\x8c\x0fcurvefit_params\x94}\x94(h\xccK\x01h\xcdj\xb0\x01\x00\x00h\xcfK\x00h\xd0j\xb1\x01\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(h\xd4G\x00\x00\x00\x00\x00\x00\x00\x00h\xd5}\x94(h\xd7G?\xe0\x00\x00\x00\x00\x00\x00h\xd8G?\xc3333333uh\xd9j\xb5\x01\x00\x00h\xdbj\xb6\x01\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uuu\x8c\x14miscellaneous_plates\x94}\x94(\x8c\x13240111_initial_H3N2\x94}\x94(\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x01\x0b\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c=data/miscellaneous_plates/H3N2library_initialPool_samples.csv\x94u\x8c\x12240124_repool_H3N2\x94}\x94(\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x01\x18\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8cGdata/miscellaneous_plates/2024-01-22_H3N2_sampleData_rePool_MOItest.csv\x94u\x8c\x12240207_repool_H3N2\x94}\x94(\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x02\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8cGdata/miscellaneous_plates/2024-02-07_H3N2_sampleData_rePool_MOItest.csv\x94u\x8c\x12240207_repool_H1N1\x94}\x94(\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x02\x07\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH1N1_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8cGdata/miscellaneous_plates/2024-02-07_H1N1_sampleData_rePool_MOItest.csv\x94u\x8c\x1f240328_repool_H3N2_variableCell\x94}\x94(\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\x03\x1c\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8cBdata/miscellaneous_plates/2024-03-28_H3N2_MOItest_variableCell.csv\x94u\x8c\x1c240924_repool_H3N2_balancing\x94}\x94(\x8c\x04date\x94j\xca\x01\x00\x00C\x04\x07\xe8\t\x18\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0cH3N2_library\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c>data/miscellaneous_plates/2024-09-24_repool_H3N2_balancing.csv\x94\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uuuu\x8c\x04rule\x94\x8c\rprocess_plate\x94\x8c\x0fbench_iteration\x94N\x8c\tscriptdir\x94\x8ck/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/seqneut-pipeline/notebooks\x94ub.'); from snakemake.logging import logger; logger.printshellcmds = False; import os; os.chdir(r'/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024');
######## snakemake preamble end #########
Process plate counts to get fraction infectivities and fit curves¶
This notebook is designed to be run using snakemake, and analyzes a plate of sequencing-based neutralization assays.
The plots generated by this notebook are interactive, so you can mouseover points for details, use the mouse-scroll to zoom and pan, and use interactive dropdowns at the bottom of the plots.
Setup¶
Import Python modules:
import pickle
import sys
import altair as alt
import matplotlib.pyplot as plt
import neutcurve
import numpy
import pandas as pd
import ruamel.yaml as yaml
_ = alt.data_transformers.disable_max_rows()
Get the variables passed by snakemake:
count_csvs = snakemake.input.count_csvs
fate_csvs = snakemake.input.fate_csvs
viral_library_csv = snakemake.input.viral_library_csv
neut_standard_set_csv = snakemake.input.neut_standard_set_csv
qc_drops_yaml = snakemake.output.qc_drops
frac_infectivity_csv = snakemake.output.frac_infectivity_csv
fits_csv = snakemake.output.fits_csv
fits_pickle = snakemake.output.fits_pickle
samples = snakemake.params.samples
plate = snakemake.wildcards.plate
plate_params = snakemake.params.plate_params
# get thresholds turning lists into tuples as needed
manual_drops = {
filter_type: [tuple(w) if isinstance(w, list) else w for w in filter_drops]
for (filter_type, filter_drops) in plate_params["manual_drops"].items()
}
group = plate_params["group"]
qc_thresholds = plate_params["qc_thresholds"]
curvefit_params = plate_params["curvefit_params"]
curvefit_qc = plate_params["curvefit_qc"]
curvefit_qc["barcode_serum_replicates_ignore_curvefit_qc"] = [
tuple(w) for w in curvefit_qc["barcode_serum_replicates_ignore_curvefit_qc"]
]
print(f"Processing {plate=}")
samples_df = pd.DataFrame(plate_params["samples"])
print(f"\nPlate has {len(samples)} samples (wells)")
assert all(
(len(samples_df) == samples_df[c].nunique())
for c in ["well", "sample", "sample_noplate"]
)
assert len(samples_df) == len(
samples_df.groupby(["serum_replicate", "dilution_factor"])
)
assert len(samples) == len(count_csvs) == len(fate_csvs) == len(samples_df)
for d, key, title in [
(manual_drops, "manual_drops", "Data manually specified to drop:"),
(qc_thresholds, "qc_thresholds", "QC thresholds applied to data:"),
(curvefit_params, "curvefit_params", "Curve-fitting parameters:"),
(curvefit_qc, "curvefit_qc", "Curve-fitting QC:"),
]:
print(f"\n{title}")
yaml.YAML(typ="rt").dump({key: d}, stream=sys.stdout)
Processing plate='plate6'
Plate has 24 samples (wells)
Data manually specified to drop:
manual_drops: {}
QC thresholds applied to data:
qc_thresholds:
avg_barcode_counts_per_well: 500
min_neut_standard_frac_per_well: 0.005
no_serum_per_viral_barcode_filters:
min_frac: 0.0001
max_fold_change: 4
max_wells: 2
per_neut_standard_barcode_filters:
min_frac: 0.005
max_fold_change: 4
max_wells: 2
min_neut_standard_count_per_well: 1000
min_no_serum_count_per_viral_barcode_well: 100
max_frac_infectivity_per_viral_barcode_well: 3
min_dilutions_per_barcode_serum_replicate: 6
Curve-fitting parameters: curvefit_params: frac_infectivity_ceiling: 1 fixtop: - 0.6 - 1 fixbottom: 0 fixslope: - 0.8 - 10
Curve-fitting QC:
curvefit_qc:
max_frac_infectivity_at_least: 0.0
goodness_of_fit:
min_R2: 0.5
max_RMSD: 0.15
serum_replicates_ignore_curvefit_qc: []
barcode_serum_replicates_ignore_curvefit_qc: []
Set up dictionary to keep track of wells, barcodes, well-barcodes, and serum-replicates that are dropped:
qc_drops = {
"wells": {},
"barcodes": {},
"barcode_wells": {},
"barcode_serum_replicates": {},
"serum_replicates": {},
}
assert set(manual_drops).issubset(
qc_drops
), f"{manual_drops.keys()=}, {qc_drops.keys()}"
Statistics on barcode-parsing for each sample¶
Make interactive chart of the "fates" of the sequencing reads parsed for each sample on the plate.
If most sequencing reads are not "valid barcodes", this could potentially indicate some problem in the sequencing or barcode set you are parsing.
Potential fates are:
- valid barcode: barcode that matches a known virus or neutralization standard, we hope most reads are this.
- invalid barcode: a barcode with proper flanking sequences, but does not match a known virus or neutralization standard. If you have a lot of reads of this type, it is probably a good idea to look at the invalid barcode CSVs (in the
./results/barcode_invalid/subdirectory created by the pipeline) to see what these invalid barcodes are. - unparseable barcode: could not parse a barcode from this read as there was not a sequence of the correct length with the appropriate flanking sequence.
- invalid outer flank: if using an outer upstream or downstream region (
upstream2ordownstream2for the illuminabarcodeparser), reads that are otherwise valid except for this outer flank. Typically you would be usingupstream2if you have a plate index embedded in your primer, and reads with this classification correspond to a different index than the one for this plate. - low quality barcode: low-quality or
Nnucleotides in barcode, could indicate problem with sequencing. - failed chastity filter: reads that failed the Illumina chastity filter, if these are reported in the FASTQ (they may not be).
Also, if the number of reads per sample is very uneven, that could indicate that you did not do a good job of balancing the different samples in the Illumina sequencing.
fates = (
pd.concat([pd.read_csv(f).assign(sample=s) for f, s in zip(fate_csvs, samples)])
.merge(samples_df, validate="many_to_one", on="sample")
.assign(
fate_counts=lambda x: x.groupby("fate")["count"].transform("sum"),
sample_well=lambda x: x["sample_noplate"] + " (" + x["well"] + ")",
)
.query("fate_counts > 0")[ # only keep fates with at least one count
["fate", "count", "well", "serum_replicate", "sample_well", "dilution_factor"]
]
)
assert len(fates) == len(fates.drop_duplicates())
serum_replicates = sorted(fates["serum_replicate"].unique())
sample_wells = list(
fates.sort_values(["serum_replicate", "dilution_factor"])["sample_well"]
)
serum_selection = alt.selection_point(
fields=["serum_replicate"],
bind=alt.binding_select(
options=[None] + serum_replicates,
labels=["all"] + serum_replicates,
name="serum",
),
)
fates_chart = (
alt.Chart(fates)
.add_params(serum_selection)
.transform_filter(serum_selection)
.encode(
alt.X("count", scale=alt.Scale(nice=False, padding=3)),
alt.Y(
"sample_well",
title=None,
sort=sample_wells,
),
alt.Color("fate", sort=sorted(fates["fate"].unique(), reverse=True)),
alt.Order("fate", sort="descending"),
tooltip=fates.columns.tolist(),
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(10),
width=200,
title=f"Barcode parsing for {plate}",
)
.configure_axis(grid=False)
)
fates_chart
Read barcode counts and apply manually specified drops¶
Read the counts per barcode:
# get barcode counts
counts = (
pd.concat([pd.read_csv(c).assign(sample=s) for c, s in zip(count_csvs, samples)])
.merge(samples_df, validate="many_to_one", on="sample")
.drop(columns=["replicate", "plate", "fastq"])
.assign(sample_well=lambda x: x["sample_noplate"] + " (" + x["well"] + ")")
)
# classify barcodes as viral or neut standard
barcode_class = pd.concat(
[
pd.read_csv(viral_library_csv)[["barcode", "strain"]].assign(
neut_standard=False,
),
pd.read_csv(neut_standard_set_csv)[["barcode"]].assign(
neut_standard=True,
strain=pd.NA,
),
],
ignore_index=True,
)
# merge counts and classification of barcodes
assert set(counts["barcode"]) == set(barcode_class["barcode"])
counts = counts.merge(barcode_class, on="barcode", validate="many_to_one")
assert set(sample_wells) == set(counts["sample_well"])
assert set(serum_replicates) == set(counts["serum_replicate"])
Apply any manually specified data drops:
for filter_type, filter_drops in manual_drops.items():
print(f"\nDropping {len(filter_drops)} {filter_type} specified in manual_drops")
assert filter_type in qc_drops
qc_drops[filter_type].update(
{w: "manual_drop" for w in filter_drops if not isinstance(w, list)}
)
if filter_type == "barcode_wells":
counts = counts[
~counts.assign(
barcode_well=lambda x: x.apply(
lambda r: (r["barcode"], r["well"]), axis=1
)
)["barcode_well"].isin(qc_drops[filter_type])
]
elif filter_type == "barcode_serum_replicates":
counts = counts[
~counts.assign(
barcode_serum_replicate=lambda x: x.apply(
lambda r: (r["barcode"], r["serum_replicate"]), axis=1
)
)["barcode_serum_replicate"].isin(qc_drops[filter_type])
]
elif filter_type == "wells":
counts = counts[~counts["well"].isin(qc_drops[filter_type])]
elif filter_type == "barcodes":
counts = counts[~counts["barcode"].isin(qc_drops[filter_type])]
else:
assert filter_type in set(counts.columns)
counts = counts[~counts[filter_type].isin(qc_drops[filter_type])]
Average counts per barcode in each well¶
Plot average counts per barcode. If a sample has inadequate barcode counts, it may not have good enough statistics for accurate analysis, and a QC-threshold is applied:
avg_barcode_counts = (
counts.groupby(
["well", "serum_replicate", "sample_well"],
dropna=False,
as_index=False,
)
.aggregate(avg_count=pd.NamedAgg("count", "mean"))
.assign(
fails_qc=lambda x: (
x["avg_count"] < qc_thresholds["avg_barcode_counts_per_well"]
),
)
)
avg_barcode_counts_chart = (
alt.Chart(avg_barcode_counts)
.add_params(serum_selection)
.transform_filter(serum_selection)
.encode(
alt.X(
"avg_count",
title="average barcode counts per well",
scale=alt.Scale(nice=False, padding=3),
),
alt.Y("sample_well", sort=sample_wells),
alt.Color(
"fails_qc",
title=f"fails {qc_thresholds['avg_barcode_counts_per_well']=}",
legend=alt.Legend(titleLimit=500),
),
tooltip=[
alt.Tooltip(c, format=".3g") if avg_barcode_counts[c].dtype == float else c
for c in avg_barcode_counts.columns
],
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(10),
width=250,
title=f"Average barcode counts per well for {plate}",
)
.configure_axis(grid=False)
)
display(avg_barcode_counts_chart)
# drop wells failing QC
avg_barcode_counts_per_well_drops = list(avg_barcode_counts.query("fails_qc")["well"])
print(
f"\nDropping {len(avg_barcode_counts_per_well_drops)} wells for failing "
f"{qc_thresholds['avg_barcode_counts_per_well']=}: "
+ str(avg_barcode_counts_per_well_drops)
)
qc_drops["wells"].update(
{w: "avg_barcode_counts_per_well" for w in avg_barcode_counts_per_well_drops}
)
counts = counts[~counts["well"].isin(qc_drops["wells"])]
Dropping 0 wells for failing qc_thresholds['avg_barcode_counts_per_well']=500: []
Fraction of counts from neutralization standard¶
Determine the fraction of counts from the neutralization standard in each sample, and make sure this fraction passess the QC threshold.
neut_standard_fracs = (
counts.assign(
neut_standard_count=lambda x: x["count"] * x["neut_standard"].astype(int)
)
.groupby(
["well", "serum_replicate", "sample_well"],
dropna=False,
as_index=False,
)
.aggregate(
total_count=pd.NamedAgg("count", "sum"),
neut_standard_count=pd.NamedAgg("neut_standard_count", "sum"),
)
.assign(
neut_standard_frac=lambda x: x["neut_standard_count"] / x["total_count"],
fails_qc=lambda x: (
x["neut_standard_frac"] < qc_thresholds["min_neut_standard_frac_per_well"]
),
)
)
neut_standard_fracs_chart = (
alt.Chart(neut_standard_fracs)
.add_params(serum_selection)
.transform_filter(serum_selection)
.encode(
alt.X(
"neut_standard_frac",
title="frac counts from neutralization standard per well",
scale=alt.Scale(nice=False, padding=3),
),
alt.Y("sample_well", sort=sample_wells),
alt.Color(
"fails_qc",
title=f"fails {qc_thresholds['min_neut_standard_frac_per_well']=}",
legend=alt.Legend(titleLimit=500),
),
tooltip=[
alt.Tooltip(c, format=".3g") if neut_standard_fracs[c].dtype == float else c
for c in neut_standard_fracs.columns
],
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(10),
width=250,
title=f"Neutralization-standard fracs per well for {plate}",
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
)
display(neut_standard_fracs_chart)
# drop wells failing QC
min_neut_standard_frac_per_well_drops = list(
neut_standard_fracs.query("fails_qc")["well"]
)
print(
f"\nDropping {len(min_neut_standard_frac_per_well_drops)} wells for failing "
f"{qc_thresholds['min_neut_standard_frac_per_well']=}: "
+ str(min_neut_standard_frac_per_well_drops)
)
qc_drops["wells"].update(
{
w: "min_neut_standard_frac_per_well"
for w in min_neut_standard_frac_per_well_drops
}
)
counts = counts[~counts["well"].isin(qc_drops["wells"])]
Dropping 0 wells for failing qc_thresholds['min_neut_standard_frac_per_well']=0.005: []
Consistency and minimum fractions for barcodes¶
We examine the fraction of counts attributable to each barcode. We do this splitting the data two ways:
Looking at all viral (but not neut-standard) barcodes only for the no-serum samples (wells).
Looking at just the neut-standard barcodes for all samples (wells).
The reasons is that if the experiment is set up perfectly, these fractions should be the same across all samples for each barcode. (We do not expect viral barcodes to have consistent fractions across no-serum samples as they will be neutralized differently depending on strain).
We plot these fractions in interactive plots (you can mouseover points and zoom) so you can identify barcodes that fail the expected consistency QC thresholds.
We also make sure the barcodes meet specified QC minimum thresholds for all samples, and flag any that do not.
barcode_selection = alt.selection_point(fields=["barcode"], on="mouseover", empty=False)
# look at all samples for neut standard barcodes, or no-serum samples for all barcodes
for is_neut_standard, df in counts.groupby("neut_standard"):
if is_neut_standard:
print(
f"\n\n{'=' * 89}\nAnalyzing neut-standard barcodes from all samples (wells)"
)
qc_name = "per_neut_standard_barcode_filters"
else:
print(f"\n\n{'=' * 89}\nAnalyzing all barcodes from no-serum samples (wells)")
qc_name = "no_serum_per_viral_barcode_filters"
df = df.query("serum == 'none'")
df = df.assign(
sample_counts=lambda x: x.groupby("sample")["count"].transform("sum"),
count_frac=lambda x: x["count"] / x["sample_counts"],
median_count_frac=lambda x: x.groupby("barcode")["count_frac"].transform(
"median"
),
fold_change_from_median=lambda x: numpy.where(
x["count_frac"] > x["median_count_frac"],
x["count_frac"] / x["median_count_frac"],
x["median_count_frac"] / x["count_frac"],
),
)[
[
"barcode",
"count",
"well",
"sample_well",
"count_frac",
"median_count_frac",
"fold_change_from_median",
]
+ ([] if is_neut_standard else ["strain"])
]
# barcode fails QC if fails in sufficient wells
qc = qc_thresholds[qc_name]
print(f"Apply QC {qc_name}: {qc}\n")
fails_qc = (
df.assign(
fails_qc=lambda x: ~(
(x["count_frac"] >= qc["min_frac"])
& (x["fold_change_from_median"] <= qc["max_fold_change"])
),
)
.groupby("barcode", as_index=False)
.aggregate(n_wells_fail_qc=pd.NamedAgg("fails_qc", "sum"))
.assign(fails_qc=lambda x: x["n_wells_fail_qc"] >= qc["max_wells"])[
["barcode", "fails_qc"]
]
)
df = df.merge(fails_qc, on="barcode", validate="many_to_one")
# make chart
evenness_chart = (
alt.Chart(df)
.add_params(barcode_selection)
.encode(
alt.X(
"count_frac",
title=(
"barcode's fraction of neut standard counts"
if is_neut_standard
else "barcode's fraction of non-neut standard counts"
),
scale=alt.Scale(nice=False, padding=5),
),
alt.Y("sample_well", sort=sample_wells),
alt.Fill(
"fails_qc",
title=f"fails {qc_name}",
legend=alt.Legend(titleLimit=500),
),
strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
size=alt.condition(barcode_selection, alt.value(60), alt.value(35)),
tooltip=[
alt.Tooltip(c, format=".2g") if df[c].dtype == float else c
for c in df.columns
],
)
.mark_circle(fillOpacity=0.45, stroke="black", strokeOpacity=1)
.properties(
height=alt.Step(10),
width=300,
title=alt.TitleParams(
(
f"{plate} all samples, neut-standard barcodes"
if is_neut_standard
else f"{plate} no-serum samples, all barcodes"
),
subtitle="x-axis is zoomable (use mouse scroll/pan)",
),
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
.interactive()
)
display(evenness_chart)
# drop barcodes failing QC
barcode_drops = list(fails_qc.query("fails_qc")["barcode"])
print(
f"\nDropping {len(barcode_drops)} barcodes for failing {qc=}: {barcode_drops}"
)
qc_drops["barcodes"].update(
{bc: "min_neut_standard_frac_per_well" for bc in barcode_drops}
)
counts = counts[~counts["barcode"].isin(qc_drops["barcodes"])]
=========================================================================================
Analyzing all barcodes from no-serum samples (wells)
Apply QC no_serum_per_viral_barcode_filters: {'min_frac': 0.0001, 'max_fold_change': 4, 'max_wells': 2}
Dropping 17 barcodes for failing qc={'min_frac': 0.0001, 'max_fold_change': 4, 'max_wells': 2}: ['AAAGTAGCAGAGGATT', 'AAATTCACAATATCCA', 'AGACCATCGCACCCAA', 'ATAACGTTTGTGCAAA', 'CAAAAGCAGCACGATA', 'CACCGACCAACTCTCT', 'CATAAAAGACTGTATA', 'CCAGAGACACGCTAGG', 'CCCTCCTCAAGGGTAA', 'CCTATAAGGCCTTACG', 'CGTACGTATGTCCCAG', 'CGTCCCTGGCGTGTCG', 'CGTTAACGGCCTATCC', 'CTCCAATAGGAGACGA', 'TATATGGAATACTAAA', 'TCTCCGATAGCCCTAC', 'TGTTGTAATCTGAATA']
=========================================================================================
Analyzing neut-standard barcodes from all samples (wells)
Apply QC per_neut_standard_barcode_filters: {'min_frac': 0.005, 'max_fold_change': 4, 'max_wells': 2}
Dropping 0 barcodes for failing qc={'min_frac': 0.005, 'max_fold_change': 4, 'max_wells': 2}: []
Compute fraction infectivity¶
The fraction infectivity for viral barcode $v_b$ in sample $s$ is computed as: $$ F_{v_b,s} = \frac{c_{v_b,s} / \left(\sum_{n_b} c_{n_b,s}\right)}{{\rm median}_{s_0}\left[ c_{v_b,s_0} / \left(\sum_{n_b} c_{n_b,s_0}\right)\right]} $$ where
- $c_{v_b,s}$ is the counts of viral barcode $v_b$ in sample $s$.
- $\sum_{n_b} c_{n_b,s}$ is the sum of the counts for all neutralization standard barcodes $n_b$ for sample $s$.
- $c_{v_b,s_0}$ is the counts of viral barcode $v_b$ in no-serum sample $s_0$.
- $\sum_{n_b} c_{n_b,s_0}$ is the sum of the counts for all neutralization standard barcodes $n_b$ for no-serum sample $s_0$.
- ${\rm median}_{s_0}\left[ c_{v_b,s_0} / \left(\sum_{n_b} c_{n_b,s_0}\right)\right]$ is the median taken across all no-serum samples of the counts of viral barcode $v_b$ versus the total counts for all neutralization standard barcodes.
First, compute the total neutralization-standard counts for each sample (well). Plot these, and drop any wells that do not meet the QC threshold.
neut_standard_counts = (
counts.query("neut_standard")
.groupby(
["well", "serum_replicate", "sample_well", "dilution_factor"],
dropna=False,
as_index=False,
)
.aggregate(neut_standard_count=pd.NamedAgg("count", "sum"))
.assign(
fails_qc=lambda x: (
x["neut_standard_count"] < qc_thresholds["min_neut_standard_count_per_well"]
),
)
)
neut_standard_counts_chart = (
alt.Chart(neut_standard_counts)
.add_params(serum_selection)
.transform_filter(serum_selection)
.encode(
alt.X(
"neut_standard_count",
title="counts from neutralization standard",
scale=alt.Scale(nice=False, padding=3),
),
alt.Y("sample_well", sort=sample_wells),
alt.Color(
"fails_qc",
title=f"fails {qc_thresholds['min_neut_standard_count_per_well']=}",
legend=alt.Legend(titleLimit=500),
),
tooltip=[
(
alt.Tooltip(c, format=".3g")
if neut_standard_counts[c].dtype == float
else c
)
for c in neut_standard_counts.columns
],
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(10),
width=250,
title=f"Neutralization-standard counts for {plate}",
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
)
display(neut_standard_counts_chart)
# drop wells failing QC
min_neut_standard_count_per_well_drops = list(
neut_standard_counts.query("fails_qc")["well"]
)
print(
f"\nDropping {len(min_neut_standard_count_per_well_drops)} wells for failing "
f"{qc_thresholds['min_neut_standard_count_per_well']=}: "
+ str(min_neut_standard_count_per_well_drops)
)
qc_drops["wells"].update(
{
w: "min_neut_standard_count_per_well"
for w in min_neut_standard_count_per_well_drops
}
)
neut_standard_counts = neut_standard_counts[
~neut_standard_counts["well"].isin(qc_drops["wells"])
]
counts = counts[~counts["well"].isin(qc_drops["wells"])]
Dropping 0 wells for failing qc_thresholds['min_neut_standard_count_per_well']=1000: []
Compute and plot the no-serum sample viral barcode counts and check if they pass the QC filters.
no_serum_counts = (
counts.query("serum == 'none'")
.query("not neut_standard")
.merge(neut_standard_counts, validate="many_to_one")[
["barcode", "strain", "well", "sample_well", "count", "neut_standard_count"]
]
.assign(
fails_qc=lambda x: (
x["count"] <= qc_thresholds["min_no_serum_count_per_viral_barcode_well"]
),
)
)
strains = sorted(no_serum_counts["strain"].unique())
strain_selection_dropdown = alt.selection_point(
fields=["strain"],
bind=alt.binding_select(
options=[None] + strains,
labels=["all"] + strains,
name="virus strain",
),
)
# make chart
no_serum_counts_chart = (
alt.Chart(no_serum_counts)
.add_params(barcode_selection, strain_selection_dropdown)
.transform_filter(strain_selection_dropdown)
.encode(
alt.X(
"count", title="viral barcode count", scale=alt.Scale(nice=False, padding=5)
),
alt.Y("sample_well", sort=sample_wells),
alt.Fill(
"fails_qc",
title=f"fails {qc_thresholds['min_no_serum_count_per_viral_barcode_well']=}",
legend=alt.Legend(titleLimit=500),
),
strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
size=alt.condition(barcode_selection, alt.value(60), alt.value(35)),
tooltip=no_serum_counts.columns.tolist(),
)
.mark_circle(fillOpacity=0.6, stroke="black", strokeOpacity=1)
.properties(
height=alt.Step(10),
width=400,
title=f"{plate} viral barcode counts in no-serum samples",
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
.interactive()
)
display(no_serum_counts_chart)
# drop barcode / wells failing QC
min_no_serum_count_per_viral_barcode_well_drops = list(
no_serum_counts.query("fails_qc")[["barcode", "well"]].itertuples(
index=False, name=None
)
)
print(
f"\nDropping {len(min_no_serum_count_per_viral_barcode_well_drops)} barcode-wells for failing "
f"{qc_thresholds['min_no_serum_count_per_viral_barcode_well']=}: "
+ str(min_no_serum_count_per_viral_barcode_well_drops)
)
qc_drops["barcode_wells"].update(
{
w: "min_no_serum_count_per_viral_barcode_well"
for w in min_no_serum_count_per_viral_barcode_well_drops
}
)
no_serum_counts = no_serum_counts[
~no_serum_counts.assign(
barcode_well=lambda x: x.apply(lambda r: (r["barcode"], r["well"]), axis=1)
)["barcode_well"].isin(qc_drops["barcode_wells"])
]
counts = counts[
~counts.assign(
barcode_well=lambda x: x.apply(lambda r: (r["barcode"], r["well"]), axis=1)
)["barcode_well"].isin(qc_drops["barcode_wells"])
]
Dropping 15 barcode-wells for failing qc_thresholds['min_no_serum_count_per_viral_barcode_well']=100: [('AAATGCTGAGAGGGTA', 'C12'), ('AGCAGACACTTTACAT', 'C12'), ('CAATTCGCCGTTCCCC', 'C12'), ('GTAGAAACTAGGAGTT', 'C12'), ('GTAATTCGCATGCGGA', 'C12'), ('CAAGACAAGCCCTATA', 'C12'), ('TCCCCGTGGTTTGACA', 'C12'), ('CCAATCCCAGCCTTTA', 'C12'), ('TTACATTTTTAGAATT', 'C12'), ('CTTCATCTCATTTAAA', 'G12'), ('TCCGCCACTATAACAT', 'G12'), ('CCGCTATCATTAACCC', 'G12'), ('ACAAAGATAAAAATTT', 'G12'), ('CACGTTAGTGAGACTT', 'G12'), ('ATGCGTCTAAACATAG', 'G12')]
Compute and plot the median ratio of viral barcode count to neut standard counts across no-serum samples. If library composition is equal, all of these values should be similar:
median_no_serum_ratio = (
no_serum_counts.assign(ratio=lambda x: x["count"] / x["neut_standard_count"])
.groupby(["barcode", "strain"], as_index=False)
.aggregate(median_no_serum_ratio=pd.NamedAgg("ratio", "median"))
)
strain_selection = alt.selection_point(fields=["strain"], on="mouseover", empty=False)
median_no_serum_ratio_chart = (
alt.Chart(median_no_serum_ratio)
.add_params(strain_selection)
.encode(
alt.X(
"median_no_serum_ratio",
title="median ratio of counts",
scale=alt.Scale(nice=False, padding=5),
),
alt.Y(
"barcode",
sort=alt.SortField("median_no_serum_ratio", order="descending"),
axis=alt.Axis(labelFontSize=5),
),
color=alt.condition(strain_selection, alt.value("orange"), alt.value("gray")),
tooltip=[
(
alt.Tooltip(c, format=".3g")
if median_no_serum_ratio[c].dtype == float
else c
)
for c in median_no_serum_ratio.columns
],
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(5),
width=250,
title=f"{plate} no-serum median ratio viral barcode to neut-standard barcode",
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
)
display(median_no_serum_ratio_chart)
Compute the actual fraction infectivities. We compute both the raw fraction infectivities and the ones with the ceiling applied:
frac_infectivity = (
counts.query("not neut_standard")
.query("serum != 'none'")
.merge(median_no_serum_ratio, validate="many_to_one")
.merge(neut_standard_counts, validate="many_to_one")
.assign(
frac_infectivity_raw=lambda x: (
(x["count"] / x["neut_standard_count"]) / x["median_no_serum_ratio"]
),
frac_infectivity_ceiling=lambda x: x["frac_infectivity_raw"].clip(
upper=curvefit_params["frac_infectivity_ceiling"]
),
concentration=lambda x: 1 / x["dilution_factor"],
plate_barcode=lambda x: x["plate_replicate"] + "-" + x["barcode"],
)[
[
"barcode",
"plate_barcode",
"well",
"strain",
"serum",
"serum_replicate",
"dilution_factor",
"concentration",
"frac_infectivity_raw",
"frac_infectivity_ceiling",
]
]
)
assert len(
frac_infectivity.groupby(["serum", "plate_barcode", "dilution_factor"])
) == len(frac_infectivity)
assert frac_infectivity["dilution_factor"].notnull().all()
assert frac_infectivity["frac_infectivity_raw"].notnull().all()
assert frac_infectivity["frac_infectivity_ceiling"].notnull().all()
Plot the fraction infectivities, both the raw values and with the ceiling applied:
frac_infectivity_chart_df = (
frac_infectivity.assign(
fails_qc=lambda x: (
x["frac_infectivity_raw"]
> qc_thresholds["max_frac_infectivity_per_viral_barcode_well"]
),
)
.melt(
id_vars=[
"barcode",
"strain",
"well",
"serum_replicate",
"dilution_factor",
"fails_qc",
],
value_vars=["frac_infectivity_raw", "frac_infectivity_ceiling"],
var_name="ceiling_applied",
value_name="frac_infectivity",
)
.assign(
ceiling_applied=lambda x: x["ceiling_applied"].map(
{
"frac_infectivity_raw": "raw fraction infectivity",
"frac_infectivity_ceiling": f"fraction infectivity with ceiling at {curvefit_params['frac_infectivity_ceiling']}",
}
)
)
)
frac_infectivity_chart = (
alt.Chart(frac_infectivity_chart_df)
.add_params(strain_selection_dropdown, barcode_selection)
.transform_filter(strain_selection_dropdown)
.encode(
alt.X(
"dilution_factor",
title="dilution factor",
scale=alt.Scale(nice=False, padding=5, type="log"),
),
alt.Y(
"frac_infectivity",
title="fraction infectivity",
scale=alt.Scale(nice=False, padding=5),
),
alt.Column(
"ceiling_applied",
sort="descending",
title=None,
header=alt.Header(labelFontSize=13, labelFontStyle="bold", labelPadding=2),
),
alt.Row(
"serum_replicate",
title=None,
spacing=3,
header=alt.Header(labelFontSize=13, labelFontStyle="bold"),
),
alt.Detail("barcode"),
alt.Shape(
"fails_qc",
title=f"fails {qc_thresholds['max_frac_infectivity_per_viral_barcode_well']=}",
legend=alt.Legend(titleLimit=500, orient="bottom"),
),
color=alt.condition(
barcode_selection, alt.value("black"), alt.value("MediumBlue")
),
strokeWidth=alt.condition(barcode_selection, alt.value(3), alt.value(1)),
opacity=alt.condition(barcode_selection, alt.value(1), alt.value(0.25)),
tooltip=[
(
alt.Tooltip(c, format=".3g")
if frac_infectivity_chart_df[c].dtype == float
else c
)
for c in frac_infectivity_chart_df.columns
],
)
.mark_line(point=True)
.properties(
height=150,
width=250,
title=f"Fraction infectivities for {plate}",
)
.interactive(bind_x=False)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
.configure_point(size=50)
.resolve_scale(x="independent", y="independent")
)
display(frac_infectivity_chart)
# drop barcode / wells failing QC
max_frac_infectivity_per_viral_barcode_well_drops = list(
frac_infectivity_chart_df.query("fails_qc")[["barcode", "well"]]
.drop_duplicates()
.itertuples(index=False, name=None)
)
print(
f"\nDropping {len(max_frac_infectivity_per_viral_barcode_well_drops)} barcode-wells for failing "
f"{qc_thresholds['max_frac_infectivity_per_viral_barcode_well']=}: "
+ str(max_frac_infectivity_per_viral_barcode_well_drops)
)
qc_drops["barcode_wells"].update(
{
w: "max_frac_infectivity_per_viral_barcode_well"
for w in max_frac_infectivity_per_viral_barcode_well_drops
}
)
frac_infectivity = frac_infectivity[
~frac_infectivity.assign(
barcode_well=lambda x: x.apply(lambda r: (r["barcode"], r["well"]), axis=1)
)["barcode_well"].isin(qc_drops["barcode_wells"])
]
Dropping 197 barcode-wells for failing qc_thresholds['max_frac_infectivity_per_viral_barcode_well']=3: [('ATCGAAAAAACTGCAA', 'C2'), ('TCCCGAACTGAACGCG', 'C2'), ('CTGAAACCTTGTCCTA', 'C3'), ('TTAACCTAACGTATAG', 'C3'), ('TCGCGGTAGATTTGCG', 'C3'), ('ACAAAGATAAAAATTT', 'C3'), ('AAACTTCGTGGTATAC', 'C4'), ('AAGAAATTATGGCAGG', 'C4'), ('CGCAAGGGATACTAAC', 'C5'), ('TGGCTAGCGCACACCA', 'C5'), ('GCTGAAGACAGTATTA', 'C5'), ('AAAGATAAATTCAAAA', 'C5'), ('ATCGATTCGATTGACG', 'C6'), ('CGTCAGAAGTTTATAA', 'C6'), ('CCGGTTTTCGGGACCT', 'C6'), ('CAAGACAAGCCCTATA', 'C6'), ('CTCATTACAGAAATTG', 'C6'), ('AATCCGGTTAACCCCG', 'C6'), ('TGTAGTATAAGAATAA', 'C6'), ('GATTCACGGCCCACAA', 'C6'), ('CATAATGCACAAACGC', 'C6'), ('ACAAAGATAAAAATTT', 'C6'), ('ATCGAAAAAACTGCAA', 'C6'), ('GAAGTAACAAACTATG', 'C7'), ('AAATTTTTCTTTAGAC', 'C7'), ('CGCGAATCACTAAGTA', 'C7'), ('CGCAGTACACAACAAG', 'C7'), ('ACTGAACAGTATAACT', 'C7'), ('AATCCGATAAGAGCTA', 'C7'), ('TCAAACTATGATATTC', 'C7'), ('CTGAAACCTTGTCCTA', 'C7'), ('CAAGACAAGCCCTATA', 'C7'), ('CACCACAGTTACTTAA', 'C7'), ('AATCCGGTTAACCCCG', 'C7'), ('CCGATAAGACGTCGCT', 'C8'), ('CTGCGAATATTGTGAC', 'C8'), ('ATTAGATTATAACGTA', 'C8'), ('AGCTGAATTAAGTATG', 'C8'), ('TAGTTGCCCCGACCTG', 'C8'), ('TGTAGTATAAGAATAA', 'C8'), ('TACGAAAATCAAGAGC', 'C8'), ('ATCGAAAAAACTGCAA', 'C8'), ('ATCGTCCCGGACATTT', 'C8'), ('TCCACACCCCTAGCTA', 'C8'), ('TTTCATATAATTTGAG', 'C8'), ('AATCCGGTTAACCCCG', 'C8'), ('ACAAAGATAAAAATTT', 'C8'), ('TTGCAATTGAAACATA', 'C9'), ('AAACTTCGTGGTATAC', 'C9'), ('TAGTTGCCCCGACCTG', 'C9'), ('AAGTTGTACTTAAGGC', 'C9'), ('AATATACCGGCACTAC', 'C9'), ('CACCCAAACGTTCGCA', 'C9'), ('TGACAAACACCTGAGG', 'C9'), ('TCTTAACTACCCGATG', 'C9'), ('TGAATTGCGTGATGGG', 'C9'), ('AATCTTTCCAATCTTG', 'C9'), ('GGGTGCAATGAATCCA', 'C9'), ('TGTAGTATAAGAATAA', 'C9'), ('TGCCGATCCAATTGAT', 'C9'), ('TTTACTCGACTAACCG', 'C9'), ('TTTCATATAATTTGAG', 'C9'), ('TCCCGAACTGAACGCG', 'C9'), ('CCGCTATCATTAACCC', 'C9'), ('ACAAAGATAAAAATTT', 'C9'), ('CTGAAACCTTGTCCTA', 'C10'), ('CGTCAGAAGTTTATAA', 'C10'), ('AGACTGTACGCGACAG', 'C10'), ('AAGTGGTAGGATAAAA', 'C10'), ('TTATGTTTTAATGGTA', 'C10'), ('CGCGAATCACTAAGTA', 'C10'), ('ATCGAAAAAACTGCAA', 'C10'), ('ATAAAGAATCCCTTGA', 'C10'), ('ATCGTCCCGGACATTT', 'C10'), ('CCGCTATCATTAACCC', 'C10'), ('CACCACAGTTACTTAA', 'C10'), ('AATCCGGTTAACCCCG', 'C10'), ('ATTAGATTATAACGTA', 'C11'), ('TCAATGAATGCGGGGT', 'C11'), ('CTGAAACCTTGTCCTA', 'C11'), ('AAAGATAAATTCAAAA', 'C11'), ('CGCGAACAACAGGGGA', 'C11'), ('CCGGTTTTCGGGACCT', 'C11'), ('TATACTCACGGAGGAT', 'C11'), ('AAATGCTGAGAGGGTA', 'C11'), ('AGTGCTATAAAAATCA', 'C11'), ('ATAAAGAATCCCTTGA', 'C11'), ('CGGCTAAAGTCTATAG', 'C11'), ('AACGACAACCATGAAT', 'C11'), ('AATTACGCATAGGCCA', 'C11'), ('CGCAGTACACAACAAG', 'C11'), ('TTTCATATAATTTGAG', 'C11'), ('ATCGAAAAAACTGCAA', 'C11'), ('AGAAAAACGACATCAT', 'C11'), ('AATCCGGTTAACCCCG', 'C11'), ('GATTCACGGCCCACAA', 'C11'), ('CACCACAGTTACTTAA', 'C11'), ('CGCCGAACGGCGGCGC', 'C11'), ('GTAGAAACTAGGAGTT', 'C11'), ('CCATCACCTTATACAC', 'G2'), ('AAGTTGTACTTAAGGC', 'G3'), ('ACAGTACAGATATGAC', 'G4'), ('AATCTTTCCAATCTTG', 'G4'), ('AAGTTGTACTTAAGGC', 'G4'), ('ACAAAGATAAAAATTT', 'G4'), ('TATCATTTCATCTACA', 'G5'), ('AATATACCGGCACTAC', 'G5'), ('CTGAAACCTTGTCCTA', 'G5'), ('CGTCAGAAGTTTATAA', 'G5'), ('CTCATTACAGAAATTG', 'G5'), ('AATTACGCATAGGCCA', 'G5'), ('CACCACAGTTACTTAA', 'G5'), ('CAAGACAAGCCCTATA', 'G5'), ('CTGAAACCTTGTCCTA', 'G6'), ('CGTATAACTGACGATT', 'G6'), ('AAGAAATTATGGCAGG', 'G6'), ('TGTAGTATAAGAATAA', 'G7'), ('CTGCGAATATTGTGAC', 'G7'), ('CTGAAACCTTGTCCTA', 'G7'), ('AATCTTTCCAATCTTG', 'G7'), ('CCGGTTTTCGGGACCT', 'G7'), ('TTTCATATAATTTGAG', 'G7'), ('ATCGAAAAAACTGCAA', 'G7'), ('CAAGACAAGCCCTATA', 'G7'), ('ACAAAGATAAAAATTT', 'G7'), ('TACGAAAATCAAGAGC', 'G8'), ('GCATTATAATCTTGTG', 'G8'), ('TTGACTCACCGAATAA', 'G8'), ('ATAATAATCATCAAGA', 'G8'), ('ACCGTTTTTCTACCAG', 'G8'), ('CGTCAGAAGTTTATAA', 'G8'), ('AGTGCTATAAAAATCA', 'G8'), ('AGCTATGCCTAGTGAA', 'G8'), ('ACCCTTTTAGATATGA', 'G8'), ('AATTACGCATAGGCCA', 'G8'), ('AATCCGGTTAACCCCG', 'G8'), ('CAATTCGCCGTTCCCC', 'G8'), ('CCGCTATCATTAACCC', 'G8'), ('CACCACAGTTACTTAA', 'G8'), ('ATGCGTCTAAACATAG', 'G8'), ('AATGACAGCTGTCTAG', 'G8'), ('TGATTCGTCAATTCAT', 'G9'), ('GACCAAAAAGCAGTAT', 'G9'), ('AGACTGTACGCGACAG', 'G9'), ('GACCAAAGCTGCAGGG', 'G9'), ('CTGAAACCTTGTCCTA', 'G9'), ('GGGTGCAATGAATCCA', 'G9'), ('CGCCGAACGGCGGCGC', 'G9'), ('CAAGACAAGCCCTATA', 'G9'), ('TCCCGAACTGAACGCG', 'G9'), ('TCTTACATTGAAAGGC', 'G10'), ('GCCCATTGAACGCAGC', 'G10'), ('CTGTGAAAAAAAATAC', 'G10'), ('GCTGGTGCACAAGATT', 'G10'), ('GGTTGCGTAGTTAATC', 'G10'), ('CGATCTTTACGAAAAA', 'G10'), ('AACAAGGCCAACATTT', 'G10'), ('TTAGCTACTAACCCGT', 'G10'), ('AGCAGACACTTTACAT', 'G10'), ('ACCCTTTTAGATATGA', 'G10'), ('AATCCGATAAGAGCTA', 'G10'), ('GAAGTAACAAACTATG', 'G10'), ('TAATAACTTGAGATTC', 'G10'), ('AAGTGGTAGGATAAAA', 'G10'), ('TTATAATGGCCGGTAT', 'G10'), ('CCCGCTAACCCTGTCT', 'G10'), ('CGCGAACAACAGGGGA', 'G10'), ('TGCCGATCCAATTGAT', 'G10'), ('CACCACAGTTACTTAA', 'G10'), ('CAAGACAAGCCCTATA', 'G10'), ('CCGCTATCATTAACCC', 'G10'), ('CGCCGAACGGCGGCGC', 'G10'), ('ATAAAGAATCCCTTGA', 'G11'), ('AATTACGCATAGGCCA', 'G11'), ('AACGACAACCATGAAT', 'G11'), ('AATAGGCCCAAATCCA', 'G11'), ('CCAATAAAATACGATG', 'G11'), ('TCAATGAATGCGGGGT', 'G11'), ('AACGACACTTACATCC', 'G11'), ('ATTAGATTATAACGTA', 'G11'), ('CGTCAGAAGTTTATAA', 'G11'), ('GACCTCCTGGGCACGC', 'G11'), ('AACAATTAATTTTTCA', 'G11'), ('CGATCTTTACGAAAAA', 'G11'), ('AATCCGATAAGAGCTA', 'G11'), ('CTGAAACCTTGTCCTA', 'G11'), ('CATAATGCACAAACGC', 'G11'), ('TCGCGGTAGATTTGCG', 'G11'), ('AACCACCCCAGAGATG', 'G11'), ('ACGGACAACCTATCGC', 'G11'), ('CCGCTATCATTAACCC', 'G11'), ('TCCACACCCCTAGCTA', 'G11'), ('ATCGAAAAAACTGCAA', 'G11'), ('TTACATTTTTAGAATT', 'G11'), ('CACCACAGTTACTTAA', 'G11'), ('CGCCGAACGGCGGCGC', 'G11'), ('ACAAAGATAAAAATTT', 'G11')]
Check how many dilutions we have per barcode / serum-replicate:
n_dilutions = (
frac_infectivity.groupby(["serum_replicate", "strain", "barcode"], as_index=False)
.aggregate(**{"number of dilutions": pd.NamedAgg("dilution_factor", "nunique")})
.assign(
fails_qc=lambda x: (
x["number of dilutions"]
< qc_thresholds["min_dilutions_per_barcode_serum_replicate"]
),
)
)
n_dilutions_chart = (
alt.Chart(n_dilutions)
.add_params(barcode_selection)
.encode(
alt.X("number of dilutions", scale=alt.Scale(nice=False, padding=4)),
alt.Y("strain", title=None),
alt.Column(
"serum_replicate",
title=None,
header=alt.Header(labelFontSize=12, labelFontStyle="bold", labelPadding=0),
),
alt.Fill(
"fails_qc",
title=f"fails {qc_thresholds['min_dilutions_per_barcode_serum_replicate']=}",
legend=alt.Legend(titleLimit=500, orient="bottom"),
),
strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
size=alt.condition(barcode_selection, alt.value(55), alt.value(35)),
tooltip=[
alt.Tooltip(c, format=".3g") if n_dilutions[c].dtype == float else c
for c in n_dilutions.columns
],
)
.mark_circle(stroke="black", strokeOpacity=1, fillOpacity=0.45)
.properties(
height=alt.Step(10),
width=120,
title=alt.TitleParams(
"number of dilutions for each barcode for each serum-replicate", dy=-2
),
)
)
display(n_dilutions_chart)
# drop barcode / serum-replicates failing QC
min_dilutions_per_barcode_serum_replicate_drops = list(
n_dilutions.query("fails_qc")[["barcode", "serum_replicate"]].itertuples(
index=False, name=None
)
)
print(
f"\nDropping {len(min_dilutions_per_barcode_serum_replicate_drops)} barcode/serum-replicates for failing "
f"{qc_thresholds['min_dilutions_per_barcode_serum_replicate']=}: "
+ str(min_dilutions_per_barcode_serum_replicate_drops)
)
qc_drops["barcode_serum_replicates"].update(
{
w: "min_dilutions_per_barcode_serum_replicate"
for w in min_dilutions_per_barcode_serum_replicate_drops
}
)
frac_infectivity = frac_infectivity[
~frac_infectivity.assign(
barcode_serum_replicate=lambda x: x.apply(
lambda r: (r["barcode"], r["serum_replicate"]), axis=1
)
)["barcode_serum_replicate"].isin(qc_drops["barcode_serum_replicates"])
]
Dropping 0 barcode/serum-replicates for failing qc_thresholds['min_dilutions_per_barcode_serum_replicate']=6: []
Fit neutralization curves without applying QC to curves¶
First fit curves to all serum replicates, then we will apply QC on the curve fits. Note that the fitting is done to the fraction infectivities with the ceiling:
fits_noqc = neutcurve.CurveFits(
frac_infectivity.rename(
columns={
"frac_infectivity_ceiling": "fraction infectivity",
"concentration": "serum concentration",
}
),
conc_col="serum concentration",
fracinf_col="fraction infectivity",
virus_col="strain",
serum_col="serum_replicate",
replicate_col="barcode",
fixtop=curvefit_params["fixtop"],
fixbottom=curvefit_params["fixbottom"],
fixslope=curvefit_params["fixslope"],
)
Determine which fits fail the curve fitting QC, and plot them. Note the plot indicates as failing QC any barcode / serum-replicate that fails, even if we are also specified to ignore the QC for that one (so it will not be removed later):
goodness_of_fit = curvefit_qc["goodness_of_fit"]
fit_params_noqc = (
frac_infectivity.groupby(["serum_replicate", "barcode"], as_index=False)
.aggregate(max_frac_infectivity=pd.NamedAgg("frac_infectivity_ceiling", "max"))
.merge(
fits_noqc.fitParams(average_only=False, no_average=True)[
["serum", "virus", "replicate", "r2", "rmsd"]
].rename(columns={"serum": "serum_replicate", "replicate": "barcode"}),
validate="one_to_one",
)
.assign(
fails_max_frac_infectivity_at_least=lambda x: (
x["max_frac_infectivity"] < curvefit_qc["max_frac_infectivity_at_least"]
),
fails_goodness_of_fit=lambda x: (
(x["r2"] < goodness_of_fit["min_R2"])
& (x["rmsd"] > goodness_of_fit["max_RMSD"])
),
fails_qc=lambda x: (
x["fails_max_frac_infectivity_at_least"] | x["fails_goodness_of_fit"]
),
ignore_qc=lambda x: x.apply(
lambda r: (
(
r["serum_replicate"]
in curvefit_qc["serum_replicates_ignore_curvefit_qc"]
)
or (
(r["barcode"], r["serum_replicate"])
in curvefit_qc["barcode_serum_replicates_ignore_curvefit_qc"]
)
),
axis=1,
),
)
)
print(f"Plotting barcode / serum-replicates that fail {curvefit_qc=}\n")
for prop, col in [
("max frac infectivity", "max_frac_infectivity"),
("curve fit R2", "r2"),
("curve fit RMSD", "rmsd"),
]:
fit_params_noqc_chart = (
alt.Chart(fit_params_noqc)
.add_params(barcode_selection)
.encode(
alt.X(col, title=prop, scale=alt.Scale(nice=False, padding=4)),
alt.Y("virus", title=None),
alt.Fill("fails_qc"),
alt.Column(
"serum_replicate",
title=None,
header=alt.Header(
labelFontSize=12, labelFontStyle="bold", labelPadding=0
),
),
strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
size=alt.condition(barcode_selection, alt.value(55), alt.value(35)),
tooltip=[
alt.Tooltip(c, format=".3g") if fit_params_noqc[c].dtype == float else c
for c in fit_params_noqc.columns
],
)
.mark_circle(stroke="black", strokeOpacity=1, fillOpacity=0.55)
.properties(
height=alt.Step(10),
width=120,
title=alt.TitleParams(f"{prop} for each barcode serum-replicate", dy=-2),
)
)
display(fit_params_noqc_chart)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
Plotting barcode / serum-replicates that fail curvefit_qc={'max_frac_infectivity_at_least': 0.0, 'goodness_of_fit': {'min_R2': 0.5, 'max_RMSD': 0.15}, 'serum_replicates_ignore_curvefit_qc': [], 'barcode_serum_replicates_ignore_curvefit_qc': []}
Now get all barcode / serum-replicate pairs that fail any of the QC. Plot curves for just these virus / serum-replicates (we plot all barcodes for a virus even if just one fails QC), and then exclude any that are not specified to ignore the QC:
barcode_serum_replicates_fail_qc = fit_params_noqc.query("fails_qc").reset_index(
drop=True
)
print(f"Here are barcode / serum-replicates that fail {curvefit_qc=}")
display(barcode_serum_replicates_fail_qc)
if len(barcode_serum_replicates_fail_qc):
print("\nCurves for viruses and serum-replicates with at least one failed barcode:")
fig, _ = fits_noqc.plotReplicates(
sera=sorted(barcode_serum_replicates_fail_qc["serum_replicate"].unique()),
viruses=sorted(barcode_serum_replicates_fail_qc["virus"].unique()),
attempt_shared_legend=False,
legendfontsize=8,
titlesize=10,
ticksize=10,
ncol=6,
draw_in_bounds=True,
)
display(fig)
plt.close(fig)
# drop barcode / serum-replicates failing QC
for qc_filter in ["max_frac_infectivity_at_least", "goodness_of_fit"]:
fits_qc_drops = list(
fit_params_noqc.query(f"fails_{qc_filter} and (not ignore_qc)")[
["barcode", "serum_replicate"]
].itertuples(index=False, name=None)
)
print(
f"\nDropping {len(fits_qc_drops)} barcode/serum-replicates for failing "
f"{qc_filter}={curvefit_qc[qc_filter]}: " + str(fits_qc_drops)
)
qc_drops["barcode_serum_replicates"].update({w: qc_filter for w in fits_qc_drops})
frac_infectivity = frac_infectivity[
~frac_infectivity.assign(
barcode_serum_replicate=lambda x: x.apply(
lambda r: (r["barcode"], r["serum_replicate"]), axis=1
)
)["barcode_serum_replicate"].isin(qc_drops["barcode_serum_replicates"])
]
fit_params_noqc = fit_params_noqc[
~fit_params_noqc.assign(
barcode_serum_replicate=lambda x: x.apply(
lambda r: (r["barcode"], r["serum_replicate"]), axis=1
)
)["barcode_serum_replicate"].isin(qc_drops["barcode_serum_replicates"])
]
Here are barcode / serum-replicates that fail curvefit_qc={'max_frac_infectivity_at_least': 0.0, 'goodness_of_fit': {'min_R2': 0.5, 'max_RMSD': 0.15}, 'serum_replicates_ignore_curvefit_qc': [], 'barcode_serum_replicates_ignore_curvefit_qc': []}
| serum_replicate | barcode | max_frac_infectivity | virus | r2 | rmsd | fails_max_frac_infectivity_at_least | fails_goodness_of_fit | fails_qc | ignore_qc | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | A230212d0_rd256 | AAACTTCGTGGTATAC | 0.857328 | A/Solwezi/13-NIC-001/2023 | 0.047393 | 0.309587 | False | True | True | False |
| 1 | A230212d0_rd256 | AAATTTTTCTTTAGAC | 1.000000 | A/Jeju/1047/2023 | 0.235728 | 0.379251 | False | True | True | False |
| 2 | A230212d0_rd256 | AACAAGGCCAACATTT | 1.000000 | A/Netherlands/01760/2023 | 0.282557 | 0.314315 | False | True | True | False |
| 3 | A230212d0_rd256 | AACAATTAATTTTTCA | 1.000000 | A/Bhutan/0845/2023 | 0.257809 | 0.365692 | False | True | True | False |
| 4 | A230212d0_rd256 | AACCACCCCAGAGATG | 1.000000 | A/Kansas/14/2017 | 0.185659 | 0.315785 | False | True | True | False |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 161 | A230212d28_rd256 | TTAGCAGTTAACGTAT | 0.964308 | A/YAMAGATA/98/2023 | 0.281747 | 0.256854 | False | True | True | False |
| 162 | A230212d28_rd256 | TTAGTCATCTGGGTGC | 1.000000 | A/SouthSudan/631/2023 | 0.361687 | 0.324690 | False | True | True | False |
| 163 | A230212d28_rd256 | TTATAATGGCCGGTAT | 0.793195 | A/EHIME/50/2023 | 0.449549 | 0.209317 | False | True | True | False |
| 164 | A230212d28_rd256 | TTTACTCGACTAACCG | 1.000000 | A/Romania/543634/2022 | -0.037478 | 0.286885 | False | True | True | False |
| 165 | A230212d28_rd256 | TTTATGCCGATAGAGA | 0.828160 | A/South_Africa/R05384/2023 | 0.454064 | 0.204560 | False | True | True | False |
166 rows × 10 columns
Curves for viruses and serum-replicates with at least one failed barcode:
Dropping 0 barcode/serum-replicates for failing max_frac_infectivity_at_least=0.0: []
Dropping 166 barcode/serum-replicates for failing goodness_of_fit={'min_R2': 0.5, 'max_RMSD': 0.15}: [('AAACTTCGTGGTATAC', 'A230212d0_rd256'), ('AAATTTTTCTTTAGAC', 'A230212d0_rd256'), ('AACAAGGCCAACATTT', 'A230212d0_rd256'), ('AACAATTAATTTTTCA', 'A230212d0_rd256'), ('AACCACCCCAGAGATG', 'A230212d0_rd256'), ('AACGACAACCATGAAT', 'A230212d0_rd256'), ('AAGCGGTTTAGGTCCA', 'A230212d0_rd256'), ('AAGCTAATCGTAGTCC', 'A230212d0_rd256'), ('AAGTGGTAGGATAAAA', 'A230212d0_rd256'), ('AAGTTGTACTTAAGGC', 'A230212d0_rd256'), ('AATGACAGCTGTCTAG', 'A230212d0_rd256'), ('AATTAATGGTAATAAA', 'A230212d0_rd256'), ('AATTACGCATAGGCCA', 'A230212d0_rd256'), ('ACCGTTTTTCTACCAG', 'A230212d0_rd256'), ('ACGTAAATCCCCACAA', 'A230212d0_rd256'), ('ACTATACATAGAAGAA', 'A230212d0_rd256'), ('AGAAAAACGACATCAT', 'A230212d0_rd256'), ('AGATGGAGGAATAAAC', 'A230212d0_rd256'), ('AGCAGACACTTTACAT', 'A230212d0_rd256'), ('AGCTATGCCTAGTGAA', 'A230212d0_rd256'), ('AGGGACTTTATTGTCC', 'A230212d0_rd256'), ('ATAAAGAATCCCTTGA', 'A230212d0_rd256'), ('ATCGATTCGATTGACG', 'A230212d0_rd256'), ('ATTTATATTGTCGAAC', 'A230212d0_rd256'), ('CAACGTGATGAGGAAG', 'A230212d0_rd256'), ('CAAGAAATGTAGTGAA', 'A230212d0_rd256'), ('CAATGGATAATGATAG', 'A230212d0_rd256'), ('CAATTCGCCGTTCCCC', 'A230212d0_rd256'), ('CACCTTCATCCTAAAG', 'A230212d0_rd256'), ('CACGTTAGTGAGACTT', 'A230212d0_rd256'), ('CAGTAGCAAAACATGC', 'A230212d0_rd256'), ('CATAATGCACAAACGC', 'A230212d0_rd256'), ('CATATTCTAAAATTGA', 'A230212d0_rd256'), ('CCAATCATGTATCACA', 'A230212d0_rd256'), ('CCACAAGTTTGAAAAC', 'A230212d0_rd256'), ('CCACGCACTTAAATAA', 'A230212d0_rd256'), ('CCCATATACTCACAGA', 'A230212d0_rd256'), ('CCCGCTAACCCTGTCT', 'A230212d0_rd256'), ('CCGATAAGACGTCGCT', 'A230212d0_rd256'), ('CCGCAATGACAATTTG', 'A230212d0_rd256'), ('CCGCTATCATTAACCC', 'A230212d0_rd256'), ('CGCGAACAACAGGGGA', 'A230212d0_rd256'), ('CTAAGGGCCTGTTCTT', 'A230212d0_rd256'), ('CTGCGAATATTGTGAC', 'A230212d0_rd256'), ('CTGTGAAAAAAAATAC', 'A230212d0_rd256'), ('CTTACAAAGGTAATTC', 'A230212d0_rd256'), ('CTTGAATACACAAACA', 'A230212d0_rd256'), ('GAAAATCGAGCTTTAA', 'A230212d0_rd256'), ('GAAAGAAAGCTATATG', 'A230212d0_rd256'), ('GACCAAAGCTGCAGGG', 'A230212d0_rd256'), ('GAGATAGCCCAGAGGT', 'A230212d0_rd256'), ('GAGCCCGAATAGCAAG', 'A230212d0_rd256'), ('GCCGTAGCGAAATCTT', 'A230212d0_rd256'), ('GCTGGTGCACAAGATT', 'A230212d0_rd256'), ('GCTTTTGAGAACCATT', 'A230212d0_rd256'), ('GGCTATATATCTGTTT', 'A230212d0_rd256'), ('GGTTGCGTAGTTAATC', 'A230212d0_rd256'), ('GTAGAAACTAGGAGTT', 'A230212d0_rd256'), ('GTTATAGAGTGCTTAC', 'A230212d0_rd256'), ('GTTATTATGACTTCAT', 'A230212d0_rd256'), ('TAAACAAAACCTATAC', 'A230212d0_rd256'), ('TAATAACTTGAGATTC', 'A230212d0_rd256'), ('TACGACGGAAACAGAA', 'A230212d0_rd256'), ('TAGCTGGGCAAAGGCT', 'A230212d0_rd256'), ('TATCAATTCGGTATTA', 'A230212d0_rd256'), ('TCAATGAATGCGGGGT', 'A230212d0_rd256'), ('TCCAAACAGCGTTAAA', 'A230212d0_rd256'), ('TCCCGAACTGAACGCG', 'A230212d0_rd256'), ('TCCGCCACTATAACAT', 'A230212d0_rd256'), ('TCCTTTAACTAATCGA', 'A230212d0_rd256'), ('TCGTCCTAGAACCTAA', 'A230212d0_rd256'), ('TCTTGAATTTCATGGA', 'A230212d0_rd256'), ('TGACAAACACCTGAGG', 'A230212d0_rd256'), ('TGATTCGTCAATTCAT', 'A230212d0_rd256'), ('TGGCTAGCGCACACCA', 'A230212d0_rd256'), ('TTAACCTAACGTATAG', 'A230212d0_rd256'), ('TTATGTTTTAATGGTA', 'A230212d0_rd256'), ('TTGACTCACCGAATAA', 'A230212d0_rd256'), ('TTTATGCCGATAGAGA', 'A230212d0_rd256'), ('TTTCATATAATTTGAG', 'A230212d0_rd256'), ('AAAACAGGTCCGGTTT', 'A230212d28_rd256'), ('AAACTTCGTGGTATAC', 'A230212d28_rd256'), ('AAAGATAAATTCAAAA', 'A230212d28_rd256'), ('AAATACCCTTGAGATA', 'A230212d28_rd256'), ('AACAAGGCCAACATTT', 'A230212d28_rd256'), ('AACAATTAATTTTTCA', 'A230212d28_rd256'), ('AACCACCCCAGAGATG', 'A230212d28_rd256'), ('AAGAAAACGGAAAGAA', 'A230212d28_rd256'), ('AAGCGGTTTAGGTCCA', 'A230212d28_rd256'), ('AAGCTAATCGTAGTCC', 'A230212d28_rd256'), ('AAGTTGTACTTAAGGC', 'A230212d28_rd256'), ('AATCTTTCCAATCTTG', 'A230212d28_rd256'), ('AATGACAGCTGTCTAG', 'A230212d28_rd256'), ('ACAGTACAGATATGAC', 'A230212d28_rd256'), ('ACCGTTTTTCTACCAG', 'A230212d28_rd256'), ('ACGTAAATCCCCACAA', 'A230212d28_rd256'), ('AGATCATAAGCAATAA', 'A230212d28_rd256'), ('AGATGGAGGAATAAAC', 'A230212d28_rd256'), ('AGCATGAGCTTGTCAT', 'A230212d28_rd256'), ('AGCTATGCCTAGTGAA', 'A230212d28_rd256'), ('AGGGACTTTATTGTCC', 'A230212d28_rd256'), ('AGTTATGTAAAACGTG', 'A230212d28_rd256'), ('ATAAAGAATCCCTTGA', 'A230212d28_rd256'), ('ATCGAAAAAACTGCAA', 'A230212d28_rd256'), ('ATTTATATTGTCGAAC', 'A230212d28_rd256'), ('CAAGACAAGCCCTATA', 'A230212d28_rd256'), ('CACCTTCATCCTAAAG', 'A230212d28_rd256'), ('CACGTTAGTGAGACTT', 'A230212d28_rd256'), ('CAGTAGCAAAACATGC', 'A230212d28_rd256'), ('CAGTGCCATCCATCCA', 'A230212d28_rd256'), ('CCAATAAAATACGATG', 'A230212d28_rd256'), ('CCAATCATGTATCACA', 'A230212d28_rd256'), ('CCCATATACTCACAGA', 'A230212d28_rd256'), ('CCGCTATCATTAACCC', 'A230212d28_rd256'), ('CCGGTTTTCGGGACCT', 'A230212d28_rd256'), ('CGATCTTTACGAAAAA', 'A230212d28_rd256'), ('CGCCGAACGGCGGCGC', 'A230212d28_rd256'), ('CGCGAACAACAGGGGA', 'A230212d28_rd256'), ('CGCGAATCACTAAGTA', 'A230212d28_rd256'), ('CGTATAACTGACGATT', 'A230212d28_rd256'), ('CTACACTACATCAAAT', 'A230212d28_rd256'), ('CTACTAGAGCAGCGAG', 'A230212d28_rd256'), ('CTATCTTAATCTACAG', 'A230212d28_rd256'), ('CTCATTACAGAAATTG', 'A230212d28_rd256'), ('CTGTGAAAAAAAATAC', 'A230212d28_rd256'), ('CTTCATCTCATTTAAA', 'A230212d28_rd256'), ('CTTGAATACACAAACA', 'A230212d28_rd256'), ('GAAAGAAAGCTATATG', 'A230212d28_rd256'), ('GACAGAAACAAAATTA', 'A230212d28_rd256'), ('GACCAAAGCTGCAGGG', 'A230212d28_rd256'), ('GAGATAGCCCAGAGGT', 'A230212d28_rd256'), ('GCAACGAGGTGTAACC', 'A230212d28_rd256'), ('GCATTATAATCTTGTG', 'A230212d28_rd256'), ('GCCGTAGCGAAATCTT', 'A230212d28_rd256'), ('GCTAATTCCAAAAGCG', 'A230212d28_rd256'), ('GCTGAAGACAGTATTA', 'A230212d28_rd256'), ('GCTTTTGAGAACCATT', 'A230212d28_rd256'), ('GGGTGCAATGAATCCA', 'A230212d28_rd256'), ('GGTTGCGTAGTTAATC', 'A230212d28_rd256'), ('GTAGAAACTAGGAGTT', 'A230212d28_rd256'), ('GTTATTATGACTTCAT', 'A230212d28_rd256'), ('GTTTTTCACTGAGTAG', 'A230212d28_rd256'), ('TACCATTTTGGTCCGC', 'A230212d28_rd256'), ('TACGAAAATCAAGAGC', 'A230212d28_rd256'), ('TACGACGGAAACAGAA', 'A230212d28_rd256'), ('TAGCTGGGCAAAGGCT', 'A230212d28_rd256'), ('TAGTTGCCCCGACCTG', 'A230212d28_rd256'), ('TATCGCAATATGATAA', 'A230212d28_rd256'), ('TATTATCTAAACGGCG', 'A230212d28_rd256'), ('TCAAACTATGATATTC', 'A230212d28_rd256'), ('TCAACCCTTCGATGTA', 'A230212d28_rd256'), ('TCAATGAATGCGGGGT', 'A230212d28_rd256'), ('TCCAAACAGCGTTAAA', 'A230212d28_rd256'), ('TCCCGAACTGAACGCG', 'A230212d28_rd256'), ('TCCTTTAACTAATCGA', 'A230212d28_rd256'), ('TCGCGGTAGATTTGCG', 'A230212d28_rd256'), ('TCGTCCTAGAACCTAA', 'A230212d28_rd256'), ('TCTTAACTACCCGATG', 'A230212d28_rd256'), ('TGAGATCAGCCGGGTG', 'A230212d28_rd256'), ('TGGCTAGCGCACACCA', 'A230212d28_rd256'), ('TTACGTCAATGTTTGA', 'A230212d28_rd256'), ('TTAGCAGTTAACGTAT', 'A230212d28_rd256'), ('TTAGTCATCTGGGTGC', 'A230212d28_rd256'), ('TTATAATGGCCGGTAT', 'A230212d28_rd256'), ('TTTACTCGACTAACCG', 'A230212d28_rd256'), ('TTTATGCCGATAGAGA', 'A230212d28_rd256')]
Fit neutralization curves after applying QC¶
No we re-fit curves after applying all the QC:
fits_qc = neutcurve.CurveFits(
frac_infectivity.rename(
columns={
"frac_infectivity_ceiling": "fraction infectivity",
"concentration": "serum concentration",
}
),
conc_col="serum concentration",
fracinf_col="fraction infectivity",
virus_col="strain",
serum_col="serum",
replicate_col="plate_barcode",
fixtop=curvefit_params["fixtop"],
fixbottom=curvefit_params["fixbottom"],
fixslope=curvefit_params["fixslope"],
)
fit_params_qc = fits_qc.fitParams(average_only=False, no_average=True)
assert len(fit_params_qc) <= len(
fits_noqc.fitParams(average_only=False, no_average=True)
)
print(f"Assigning fits for this plate to {group}")
fit_params_qc.insert(0, "group", group)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s) /fh/fast/bloom_j/computational_notebooks/ckikawa/2024/flu_seqneut_H3N2_2023-2024/.snakemake/conda/3d7bcea0b75814e39f27531956478cb3_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
Assigning fits for this plate to pilot
Plot all the curves that passed QC:
if fits_qc.sera:
_ = fits_qc.plotReplicates(
attempt_shared_legend=False,
legendfontsize=8,
titlesize=10,
ticksize=10,
ncol=6,
draw_in_bounds=True,
)
else:
print("No sera passed QC.")
Save results to files¶
print(f"Writing fraction infectivities to {frac_infectivity_csv}")
(
frac_infectivity[
[
"serum",
"strain",
"plate_barcode",
"dilution_factor",
"frac_infectivity_raw",
"frac_infectivity_ceiling",
]
]
.sort_values(["serum", "plate_barcode", "dilution_factor"])
.to_csv(frac_infectivity_csv, index=False, float_format="%.4g")
)
print(f"\nWriting fit parameters to {fits_csv}")
(
fit_params_qc.drop(columns=["nreplicates", "ic50_str"]).to_csv(
fits_csv, index=False, float_format="%.4g"
)
)
print(f"\nPickling neutcurve.CurveFits object for these data to {fits_pickle}")
with open(fits_pickle, "wb") as f:
pickle.dump(fits_qc, f)
print(f"\nWriting QC drops to {qc_drops_yaml}")
def tup_to_str(x):
return " ".join(x) if isinstance(x, tuple) else x
qc_drops_for_yaml = {
key: {tup_to_str(key2): val2 for key2, val2 in val.items()}
for key, val in qc_drops.items()
}
with open(qc_drops_yaml, "w") as f:
yaml.YAML(typ="rt").dump(qc_drops_for_yaml, f)
print("\nHere are the QC drops:\n***************************")
yaml.YAML(typ="rt").dump(qc_drops_for_yaml, sys.stdout)
Writing fraction infectivities to results/plates/plate6/frac_infectivity.csv
Writing fit parameters to results/plates/plate6/curvefits.csv
Pickling neutcurve.CurveFits object for these data to results/plates/plate6/curvefits.pickle
Writing QC drops to results/plates/plate6/qc_drops.yml
Here are the QC drops:
***************************
wells: {}
barcodes:
AAAGTAGCAGAGGATT: min_neut_standard_frac_per_well
AAATTCACAATATCCA: min_neut_standard_frac_per_well
AGACCATCGCACCCAA: min_neut_standard_frac_per_well
ATAACGTTTGTGCAAA: min_neut_standard_frac_per_well
CAAAAGCAGCACGATA: min_neut_standard_frac_per_well
CACCGACCAACTCTCT: min_neut_standard_frac_per_well
CATAAAAGACTGTATA: min_neut_standard_frac_per_well
CCAGAGACACGCTAGG: min_neut_standard_frac_per_well
CCCTCCTCAAGGGTAA: min_neut_standard_frac_per_well
CCTATAAGGCCTTACG: min_neut_standard_frac_per_well
CGTACGTATGTCCCAG: min_neut_standard_frac_per_well
CGTCCCTGGCGTGTCG: min_neut_standard_frac_per_well
CGTTAACGGCCTATCC: min_neut_standard_frac_per_well
CTCCAATAGGAGACGA: min_neut_standard_frac_per_well
TATATGGAATACTAAA: min_neut_standard_frac_per_well
TCTCCGATAGCCCTAC: min_neut_standard_frac_per_well
TGTTGTAATCTGAATA: min_neut_standard_frac_per_well
barcode_wells:
AAATGCTGAGAGGGTA C12: min_no_serum_count_per_viral_barcode_well
AGCAGACACTTTACAT C12: min_no_serum_count_per_viral_barcode_well
CAATTCGCCGTTCCCC C12: min_no_serum_count_per_viral_barcode_well
GTAGAAACTAGGAGTT C12: min_no_serum_count_per_viral_barcode_well
GTAATTCGCATGCGGA C12: min_no_serum_count_per_viral_barcode_well
CAAGACAAGCCCTATA C12: min_no_serum_count_per_viral_barcode_well
TCCCCGTGGTTTGACA C12: min_no_serum_count_per_viral_barcode_well
CCAATCCCAGCCTTTA C12: min_no_serum_count_per_viral_barcode_well
TTACATTTTTAGAATT C12: min_no_serum_count_per_viral_barcode_well
CTTCATCTCATTTAAA G12: min_no_serum_count_per_viral_barcode_well
TCCGCCACTATAACAT G12: min_no_serum_count_per_viral_barcode_well
CCGCTATCATTAACCC G12: min_no_serum_count_per_viral_barcode_well
ACAAAGATAAAAATTT G12: min_no_serum_count_per_viral_barcode_well
CACGTTAGTGAGACTT G12: min_no_serum_count_per_viral_barcode_well
ATGCGTCTAAACATAG G12: min_no_serum_count_per_viral_barcode_well
ATCGAAAAAACTGCAA C2: max_frac_infectivity_per_viral_barcode_well
TCCCGAACTGAACGCG C2: max_frac_infectivity_per_viral_barcode_well
CTGAAACCTTGTCCTA C3: max_frac_infectivity_per_viral_barcode_well
TTAACCTAACGTATAG C3: max_frac_infectivity_per_viral_barcode_well
TCGCGGTAGATTTGCG C3: max_frac_infectivity_per_viral_barcode_well
ACAAAGATAAAAATTT C3: max_frac_infectivity_per_viral_barcode_well
AAACTTCGTGGTATAC C4: max_frac_infectivity_per_viral_barcode_well
AAGAAATTATGGCAGG C4: max_frac_infectivity_per_viral_barcode_well
CGCAAGGGATACTAAC C5: max_frac_infectivity_per_viral_barcode_well
TGGCTAGCGCACACCA C5: max_frac_infectivity_per_viral_barcode_well
GCTGAAGACAGTATTA C5: max_frac_infectivity_per_viral_barcode_well
AAAGATAAATTCAAAA C5: max_frac_infectivity_per_viral_barcode_well
ATCGATTCGATTGACG C6: max_frac_infectivity_per_viral_barcode_well
CGTCAGAAGTTTATAA C6: max_frac_infectivity_per_viral_barcode_well
CCGGTTTTCGGGACCT C6: max_frac_infectivity_per_viral_barcode_well
CAAGACAAGCCCTATA C6: max_frac_infectivity_per_viral_barcode_well
CTCATTACAGAAATTG C6: max_frac_infectivity_per_viral_barcode_well
AATCCGGTTAACCCCG C6: max_frac_infectivity_per_viral_barcode_well
TGTAGTATAAGAATAA C6: max_frac_infectivity_per_viral_barcode_well
GATTCACGGCCCACAA C6: max_frac_infectivity_per_viral_barcode_well
CATAATGCACAAACGC C6: max_frac_infectivity_per_viral_barcode_well
ACAAAGATAAAAATTT C6: max_frac_infectivity_per_viral_barcode_well
ATCGAAAAAACTGCAA C6: max_frac_infectivity_per_viral_barcode_well
GAAGTAACAAACTATG C7: max_frac_infectivity_per_viral_barcode_well
AAATTTTTCTTTAGAC C7: max_frac_infectivity_per_viral_barcode_well
CGCGAATCACTAAGTA C7: max_frac_infectivity_per_viral_barcode_well
CGCAGTACACAACAAG C7: max_frac_infectivity_per_viral_barcode_well
ACTGAACAGTATAACT C7: max_frac_infectivity_per_viral_barcode_well
AATCCGATAAGAGCTA C7: max_frac_infectivity_per_viral_barcode_well
TCAAACTATGATATTC C7: max_frac_infectivity_per_viral_barcode_well
CTGAAACCTTGTCCTA C7: max_frac_infectivity_per_viral_barcode_well
CAAGACAAGCCCTATA C7: max_frac_infectivity_per_viral_barcode_well
CACCACAGTTACTTAA C7: max_frac_infectivity_per_viral_barcode_well
AATCCGGTTAACCCCG C7: max_frac_infectivity_per_viral_barcode_well
CCGATAAGACGTCGCT C8: max_frac_infectivity_per_viral_barcode_well
CTGCGAATATTGTGAC C8: max_frac_infectivity_per_viral_barcode_well
ATTAGATTATAACGTA C8: max_frac_infectivity_per_viral_barcode_well
AGCTGAATTAAGTATG C8: max_frac_infectivity_per_viral_barcode_well
TAGTTGCCCCGACCTG C8: max_frac_infectivity_per_viral_barcode_well
TGTAGTATAAGAATAA C8: max_frac_infectivity_per_viral_barcode_well
TACGAAAATCAAGAGC C8: max_frac_infectivity_per_viral_barcode_well
ATCGAAAAAACTGCAA C8: max_frac_infectivity_per_viral_barcode_well
ATCGTCCCGGACATTT C8: max_frac_infectivity_per_viral_barcode_well
TCCACACCCCTAGCTA C8: max_frac_infectivity_per_viral_barcode_well
TTTCATATAATTTGAG C8: max_frac_infectivity_per_viral_barcode_well
AATCCGGTTAACCCCG C8: max_frac_infectivity_per_viral_barcode_well
ACAAAGATAAAAATTT C8: max_frac_infectivity_per_viral_barcode_well
TTGCAATTGAAACATA C9: max_frac_infectivity_per_viral_barcode_well
AAACTTCGTGGTATAC C9: max_frac_infectivity_per_viral_barcode_well
TAGTTGCCCCGACCTG C9: max_frac_infectivity_per_viral_barcode_well
AAGTTGTACTTAAGGC C9: max_frac_infectivity_per_viral_barcode_well
AATATACCGGCACTAC C9: max_frac_infectivity_per_viral_barcode_well
CACCCAAACGTTCGCA C9: max_frac_infectivity_per_viral_barcode_well
TGACAAACACCTGAGG C9: max_frac_infectivity_per_viral_barcode_well
TCTTAACTACCCGATG C9: max_frac_infectivity_per_viral_barcode_well
TGAATTGCGTGATGGG C9: max_frac_infectivity_per_viral_barcode_well
AATCTTTCCAATCTTG C9: max_frac_infectivity_per_viral_barcode_well
GGGTGCAATGAATCCA C9: max_frac_infectivity_per_viral_barcode_well
TGTAGTATAAGAATAA C9: max_frac_infectivity_per_viral_barcode_well
TGCCGATCCAATTGAT C9: max_frac_infectivity_per_viral_barcode_well
TTTACTCGACTAACCG C9: max_frac_infectivity_per_viral_barcode_well
TTTCATATAATTTGAG C9: max_frac_infectivity_per_viral_barcode_well
TCCCGAACTGAACGCG C9: max_frac_infectivity_per_viral_barcode_well
CCGCTATCATTAACCC C9: max_frac_infectivity_per_viral_barcode_well
ACAAAGATAAAAATTT C9: max_frac_infectivity_per_viral_barcode_well
CTGAAACCTTGTCCTA C10: max_frac_infectivity_per_viral_barcode_well
CGTCAGAAGTTTATAA C10: max_frac_infectivity_per_viral_barcode_well
AGACTGTACGCGACAG C10: max_frac_infectivity_per_viral_barcode_well
AAGTGGTAGGATAAAA C10: max_frac_infectivity_per_viral_barcode_well
TTATGTTTTAATGGTA C10: max_frac_infectivity_per_viral_barcode_well
CGCGAATCACTAAGTA C10: max_frac_infectivity_per_viral_barcode_well
ATCGAAAAAACTGCAA C10: max_frac_infectivity_per_viral_barcode_well
ATAAAGAATCCCTTGA C10: max_frac_infectivity_per_viral_barcode_well
ATCGTCCCGGACATTT C10: max_frac_infectivity_per_viral_barcode_well
CCGCTATCATTAACCC C10: max_frac_infectivity_per_viral_barcode_well
CACCACAGTTACTTAA C10: max_frac_infectivity_per_viral_barcode_well
AATCCGGTTAACCCCG C10: max_frac_infectivity_per_viral_barcode_well
ATTAGATTATAACGTA C11: max_frac_infectivity_per_viral_barcode_well
TCAATGAATGCGGGGT C11: max_frac_infectivity_per_viral_barcode_well
CTGAAACCTTGTCCTA C11: max_frac_infectivity_per_viral_barcode_well
AAAGATAAATTCAAAA C11: max_frac_infectivity_per_viral_barcode_well
CGCGAACAACAGGGGA C11: max_frac_infectivity_per_viral_barcode_well
CCGGTTTTCGGGACCT C11: max_frac_infectivity_per_viral_barcode_well
TATACTCACGGAGGAT C11: max_frac_infectivity_per_viral_barcode_well
AAATGCTGAGAGGGTA C11: max_frac_infectivity_per_viral_barcode_well
AGTGCTATAAAAATCA C11: max_frac_infectivity_per_viral_barcode_well
ATAAAGAATCCCTTGA C11: max_frac_infectivity_per_viral_barcode_well
CGGCTAAAGTCTATAG C11: max_frac_infectivity_per_viral_barcode_well
AACGACAACCATGAAT C11: max_frac_infectivity_per_viral_barcode_well
AATTACGCATAGGCCA C11: max_frac_infectivity_per_viral_barcode_well
CGCAGTACACAACAAG C11: max_frac_infectivity_per_viral_barcode_well
TTTCATATAATTTGAG C11: max_frac_infectivity_per_viral_barcode_well
ATCGAAAAAACTGCAA C11: max_frac_infectivity_per_viral_barcode_well
AGAAAAACGACATCAT C11: max_frac_infectivity_per_viral_barcode_well
AATCCGGTTAACCCCG C11: max_frac_infectivity_per_viral_barcode_well
GATTCACGGCCCACAA C11: max_frac_infectivity_per_viral_barcode_well
CACCACAGTTACTTAA C11: max_frac_infectivity_per_viral_barcode_well
CGCCGAACGGCGGCGC C11: max_frac_infectivity_per_viral_barcode_well
GTAGAAACTAGGAGTT C11: max_frac_infectivity_per_viral_barcode_well
CCATCACCTTATACAC G2: max_frac_infectivity_per_viral_barcode_well
AAGTTGTACTTAAGGC G3: max_frac_infectivity_per_viral_barcode_well
ACAGTACAGATATGAC G4: max_frac_infectivity_per_viral_barcode_well
AATCTTTCCAATCTTG G4: max_frac_infectivity_per_viral_barcode_well
AAGTTGTACTTAAGGC G4: max_frac_infectivity_per_viral_barcode_well
ACAAAGATAAAAATTT G4: max_frac_infectivity_per_viral_barcode_well
TATCATTTCATCTACA G5: max_frac_infectivity_per_viral_barcode_well
AATATACCGGCACTAC G5: max_frac_infectivity_per_viral_barcode_well
CTGAAACCTTGTCCTA G5: max_frac_infectivity_per_viral_barcode_well
CGTCAGAAGTTTATAA G5: max_frac_infectivity_per_viral_barcode_well
CTCATTACAGAAATTG G5: max_frac_infectivity_per_viral_barcode_well
AATTACGCATAGGCCA G5: max_frac_infectivity_per_viral_barcode_well
CACCACAGTTACTTAA G5: max_frac_infectivity_per_viral_barcode_well
CAAGACAAGCCCTATA G5: max_frac_infectivity_per_viral_barcode_well
CTGAAACCTTGTCCTA G6: max_frac_infectivity_per_viral_barcode_well
CGTATAACTGACGATT G6: max_frac_infectivity_per_viral_barcode_well
AAGAAATTATGGCAGG G6: max_frac_infectivity_per_viral_barcode_well
TGTAGTATAAGAATAA G7: max_frac_infectivity_per_viral_barcode_well
CTGCGAATATTGTGAC G7: max_frac_infectivity_per_viral_barcode_well
CTGAAACCTTGTCCTA G7: max_frac_infectivity_per_viral_barcode_well
AATCTTTCCAATCTTG G7: max_frac_infectivity_per_viral_barcode_well
CCGGTTTTCGGGACCT G7: max_frac_infectivity_per_viral_barcode_well
TTTCATATAATTTGAG G7: max_frac_infectivity_per_viral_barcode_well
ATCGAAAAAACTGCAA G7: max_frac_infectivity_per_viral_barcode_well
CAAGACAAGCCCTATA G7: max_frac_infectivity_per_viral_barcode_well
ACAAAGATAAAAATTT G7: max_frac_infectivity_per_viral_barcode_well
TACGAAAATCAAGAGC G8: max_frac_infectivity_per_viral_barcode_well
GCATTATAATCTTGTG G8: max_frac_infectivity_per_viral_barcode_well
TTGACTCACCGAATAA G8: max_frac_infectivity_per_viral_barcode_well
ATAATAATCATCAAGA G8: max_frac_infectivity_per_viral_barcode_well
ACCGTTTTTCTACCAG G8: max_frac_infectivity_per_viral_barcode_well
CGTCAGAAGTTTATAA G8: max_frac_infectivity_per_viral_barcode_well
AGTGCTATAAAAATCA G8: max_frac_infectivity_per_viral_barcode_well
AGCTATGCCTAGTGAA G8: max_frac_infectivity_per_viral_barcode_well
ACCCTTTTAGATATGA G8: max_frac_infectivity_per_viral_barcode_well
AATTACGCATAGGCCA G8: max_frac_infectivity_per_viral_barcode_well
AATCCGGTTAACCCCG G8: max_frac_infectivity_per_viral_barcode_well
CAATTCGCCGTTCCCC G8: max_frac_infectivity_per_viral_barcode_well
CCGCTATCATTAACCC G8: max_frac_infectivity_per_viral_barcode_well
CACCACAGTTACTTAA G8: max_frac_infectivity_per_viral_barcode_well
ATGCGTCTAAACATAG G8: max_frac_infectivity_per_viral_barcode_well
AATGACAGCTGTCTAG G8: max_frac_infectivity_per_viral_barcode_well
TGATTCGTCAATTCAT G9: max_frac_infectivity_per_viral_barcode_well
GACCAAAAAGCAGTAT G9: max_frac_infectivity_per_viral_barcode_well
AGACTGTACGCGACAG G9: max_frac_infectivity_per_viral_barcode_well
GACCAAAGCTGCAGGG G9: max_frac_infectivity_per_viral_barcode_well
CTGAAACCTTGTCCTA G9: max_frac_infectivity_per_viral_barcode_well
GGGTGCAATGAATCCA G9: max_frac_infectivity_per_viral_barcode_well
CGCCGAACGGCGGCGC G9: max_frac_infectivity_per_viral_barcode_well
CAAGACAAGCCCTATA G9: max_frac_infectivity_per_viral_barcode_well
TCCCGAACTGAACGCG G9: max_frac_infectivity_per_viral_barcode_well
TCTTACATTGAAAGGC G10: max_frac_infectivity_per_viral_barcode_well
GCCCATTGAACGCAGC G10: max_frac_infectivity_per_viral_barcode_well
CTGTGAAAAAAAATAC G10: max_frac_infectivity_per_viral_barcode_well
GCTGGTGCACAAGATT G10: max_frac_infectivity_per_viral_barcode_well
GGTTGCGTAGTTAATC G10: max_frac_infectivity_per_viral_barcode_well
CGATCTTTACGAAAAA G10: max_frac_infectivity_per_viral_barcode_well
AACAAGGCCAACATTT G10: max_frac_infectivity_per_viral_barcode_well
TTAGCTACTAACCCGT G10: max_frac_infectivity_per_viral_barcode_well
AGCAGACACTTTACAT G10: max_frac_infectivity_per_viral_barcode_well
ACCCTTTTAGATATGA G10: max_frac_infectivity_per_viral_barcode_well
AATCCGATAAGAGCTA G10: max_frac_infectivity_per_viral_barcode_well
GAAGTAACAAACTATG G10: max_frac_infectivity_per_viral_barcode_well
TAATAACTTGAGATTC G10: max_frac_infectivity_per_viral_barcode_well
AAGTGGTAGGATAAAA G10: max_frac_infectivity_per_viral_barcode_well
TTATAATGGCCGGTAT G10: max_frac_infectivity_per_viral_barcode_well
CCCGCTAACCCTGTCT G10: max_frac_infectivity_per_viral_barcode_well
CGCGAACAACAGGGGA G10: max_frac_infectivity_per_viral_barcode_well
TGCCGATCCAATTGAT G10: max_frac_infectivity_per_viral_barcode_well
CACCACAGTTACTTAA G10: max_frac_infectivity_per_viral_barcode_well
CAAGACAAGCCCTATA G10: max_frac_infectivity_per_viral_barcode_well
CCGCTATCATTAACCC G10: max_frac_infectivity_per_viral_barcode_well
CGCCGAACGGCGGCGC G10: max_frac_infectivity_per_viral_barcode_well
ATAAAGAATCCCTTGA G11: max_frac_infectivity_per_viral_barcode_well
AATTACGCATAGGCCA G11: max_frac_infectivity_per_viral_barcode_well
AACGACAACCATGAAT G11: max_frac_infectivity_per_viral_barcode_well
AATAGGCCCAAATCCA G11: max_frac_infectivity_per_viral_barcode_well
CCAATAAAATACGATG G11: max_frac_infectivity_per_viral_barcode_well
TCAATGAATGCGGGGT G11: max_frac_infectivity_per_viral_barcode_well
AACGACACTTACATCC G11: max_frac_infectivity_per_viral_barcode_well
ATTAGATTATAACGTA G11: max_frac_infectivity_per_viral_barcode_well
CGTCAGAAGTTTATAA G11: max_frac_infectivity_per_viral_barcode_well
GACCTCCTGGGCACGC G11: max_frac_infectivity_per_viral_barcode_well
AACAATTAATTTTTCA G11: max_frac_infectivity_per_viral_barcode_well
CGATCTTTACGAAAAA G11: max_frac_infectivity_per_viral_barcode_well
AATCCGATAAGAGCTA G11: max_frac_infectivity_per_viral_barcode_well
CTGAAACCTTGTCCTA G11: max_frac_infectivity_per_viral_barcode_well
CATAATGCACAAACGC G11: max_frac_infectivity_per_viral_barcode_well
TCGCGGTAGATTTGCG G11: max_frac_infectivity_per_viral_barcode_well
AACCACCCCAGAGATG G11: max_frac_infectivity_per_viral_barcode_well
ACGGACAACCTATCGC G11: max_frac_infectivity_per_viral_barcode_well
CCGCTATCATTAACCC G11: max_frac_infectivity_per_viral_barcode_well
TCCACACCCCTAGCTA G11: max_frac_infectivity_per_viral_barcode_well
ATCGAAAAAACTGCAA G11: max_frac_infectivity_per_viral_barcode_well
TTACATTTTTAGAATT G11: max_frac_infectivity_per_viral_barcode_well
CACCACAGTTACTTAA G11: max_frac_infectivity_per_viral_barcode_well
CGCCGAACGGCGGCGC G11: max_frac_infectivity_per_viral_barcode_well
ACAAAGATAAAAATTT G11: max_frac_infectivity_per_viral_barcode_well
barcode_serum_replicates:
AAACTTCGTGGTATAC A230212d0_rd256: goodness_of_fit
AAATTTTTCTTTAGAC A230212d0_rd256: goodness_of_fit
AACAAGGCCAACATTT A230212d0_rd256: goodness_of_fit
AACAATTAATTTTTCA A230212d0_rd256: goodness_of_fit
AACCACCCCAGAGATG A230212d0_rd256: goodness_of_fit
AACGACAACCATGAAT A230212d0_rd256: goodness_of_fit
AAGCGGTTTAGGTCCA A230212d0_rd256: goodness_of_fit
AAGCTAATCGTAGTCC A230212d0_rd256: goodness_of_fit
AAGTGGTAGGATAAAA A230212d0_rd256: goodness_of_fit
AAGTTGTACTTAAGGC A230212d0_rd256: goodness_of_fit
AATGACAGCTGTCTAG A230212d0_rd256: goodness_of_fit
AATTAATGGTAATAAA A230212d0_rd256: goodness_of_fit
AATTACGCATAGGCCA A230212d0_rd256: goodness_of_fit
ACCGTTTTTCTACCAG A230212d0_rd256: goodness_of_fit
ACGTAAATCCCCACAA A230212d0_rd256: goodness_of_fit
ACTATACATAGAAGAA A230212d0_rd256: goodness_of_fit
AGAAAAACGACATCAT A230212d0_rd256: goodness_of_fit
AGATGGAGGAATAAAC A230212d0_rd256: goodness_of_fit
AGCAGACACTTTACAT A230212d0_rd256: goodness_of_fit
AGCTATGCCTAGTGAA A230212d0_rd256: goodness_of_fit
AGGGACTTTATTGTCC A230212d0_rd256: goodness_of_fit
ATAAAGAATCCCTTGA A230212d0_rd256: goodness_of_fit
ATCGATTCGATTGACG A230212d0_rd256: goodness_of_fit
ATTTATATTGTCGAAC A230212d0_rd256: goodness_of_fit
CAACGTGATGAGGAAG A230212d0_rd256: goodness_of_fit
CAAGAAATGTAGTGAA A230212d0_rd256: goodness_of_fit
CAATGGATAATGATAG A230212d0_rd256: goodness_of_fit
CAATTCGCCGTTCCCC A230212d0_rd256: goodness_of_fit
CACCTTCATCCTAAAG A230212d0_rd256: goodness_of_fit
CACGTTAGTGAGACTT A230212d0_rd256: goodness_of_fit
CAGTAGCAAAACATGC A230212d0_rd256: goodness_of_fit
CATAATGCACAAACGC A230212d0_rd256: goodness_of_fit
CATATTCTAAAATTGA A230212d0_rd256: goodness_of_fit
CCAATCATGTATCACA A230212d0_rd256: goodness_of_fit
CCACAAGTTTGAAAAC A230212d0_rd256: goodness_of_fit
CCACGCACTTAAATAA A230212d0_rd256: goodness_of_fit
CCCATATACTCACAGA A230212d0_rd256: goodness_of_fit
CCCGCTAACCCTGTCT A230212d0_rd256: goodness_of_fit
CCGATAAGACGTCGCT A230212d0_rd256: goodness_of_fit
CCGCAATGACAATTTG A230212d0_rd256: goodness_of_fit
CCGCTATCATTAACCC A230212d0_rd256: goodness_of_fit
CGCGAACAACAGGGGA A230212d0_rd256: goodness_of_fit
CTAAGGGCCTGTTCTT A230212d0_rd256: goodness_of_fit
CTGCGAATATTGTGAC A230212d0_rd256: goodness_of_fit
CTGTGAAAAAAAATAC A230212d0_rd256: goodness_of_fit
CTTACAAAGGTAATTC A230212d0_rd256: goodness_of_fit
CTTGAATACACAAACA A230212d0_rd256: goodness_of_fit
GAAAATCGAGCTTTAA A230212d0_rd256: goodness_of_fit
GAAAGAAAGCTATATG A230212d0_rd256: goodness_of_fit
GACCAAAGCTGCAGGG A230212d0_rd256: goodness_of_fit
GAGATAGCCCAGAGGT A230212d0_rd256: goodness_of_fit
GAGCCCGAATAGCAAG A230212d0_rd256: goodness_of_fit
GCCGTAGCGAAATCTT A230212d0_rd256: goodness_of_fit
GCTGGTGCACAAGATT A230212d0_rd256: goodness_of_fit
GCTTTTGAGAACCATT A230212d0_rd256: goodness_of_fit
GGCTATATATCTGTTT A230212d0_rd256: goodness_of_fit
GGTTGCGTAGTTAATC A230212d0_rd256: goodness_of_fit
GTAGAAACTAGGAGTT A230212d0_rd256: goodness_of_fit
GTTATAGAGTGCTTAC A230212d0_rd256: goodness_of_fit
GTTATTATGACTTCAT A230212d0_rd256: goodness_of_fit
TAAACAAAACCTATAC A230212d0_rd256: goodness_of_fit
TAATAACTTGAGATTC A230212d0_rd256: goodness_of_fit
TACGACGGAAACAGAA A230212d0_rd256: goodness_of_fit
TAGCTGGGCAAAGGCT A230212d0_rd256: goodness_of_fit
TATCAATTCGGTATTA A230212d0_rd256: goodness_of_fit
TCAATGAATGCGGGGT A230212d0_rd256: goodness_of_fit
TCCAAACAGCGTTAAA A230212d0_rd256: goodness_of_fit
TCCCGAACTGAACGCG A230212d0_rd256: goodness_of_fit
TCCGCCACTATAACAT A230212d0_rd256: goodness_of_fit
TCCTTTAACTAATCGA A230212d0_rd256: goodness_of_fit
TCGTCCTAGAACCTAA A230212d0_rd256: goodness_of_fit
TCTTGAATTTCATGGA A230212d0_rd256: goodness_of_fit
TGACAAACACCTGAGG A230212d0_rd256: goodness_of_fit
TGATTCGTCAATTCAT A230212d0_rd256: goodness_of_fit
TGGCTAGCGCACACCA A230212d0_rd256: goodness_of_fit
TTAACCTAACGTATAG A230212d0_rd256: goodness_of_fit
TTATGTTTTAATGGTA A230212d0_rd256: goodness_of_fit
TTGACTCACCGAATAA A230212d0_rd256: goodness_of_fit
TTTATGCCGATAGAGA A230212d0_rd256: goodness_of_fit
TTTCATATAATTTGAG A230212d0_rd256: goodness_of_fit
AAAACAGGTCCGGTTT A230212d28_rd256: goodness_of_fit
AAACTTCGTGGTATAC A230212d28_rd256: goodness_of_fit
AAAGATAAATTCAAAA A230212d28_rd256: goodness_of_fit
AAATACCCTTGAGATA A230212d28_rd256: goodness_of_fit
AACAAGGCCAACATTT A230212d28_rd256: goodness_of_fit
AACAATTAATTTTTCA A230212d28_rd256: goodness_of_fit
AACCACCCCAGAGATG A230212d28_rd256: goodness_of_fit
AAGAAAACGGAAAGAA A230212d28_rd256: goodness_of_fit
AAGCGGTTTAGGTCCA A230212d28_rd256: goodness_of_fit
AAGCTAATCGTAGTCC A230212d28_rd256: goodness_of_fit
AAGTTGTACTTAAGGC A230212d28_rd256: goodness_of_fit
AATCTTTCCAATCTTG A230212d28_rd256: goodness_of_fit
AATGACAGCTGTCTAG A230212d28_rd256: goodness_of_fit
ACAGTACAGATATGAC A230212d28_rd256: goodness_of_fit
ACCGTTTTTCTACCAG A230212d28_rd256: goodness_of_fit
ACGTAAATCCCCACAA A230212d28_rd256: goodness_of_fit
AGATCATAAGCAATAA A230212d28_rd256: goodness_of_fit
AGATGGAGGAATAAAC A230212d28_rd256: goodness_of_fit
AGCATGAGCTTGTCAT A230212d28_rd256: goodness_of_fit
AGCTATGCCTAGTGAA A230212d28_rd256: goodness_of_fit
AGGGACTTTATTGTCC A230212d28_rd256: goodness_of_fit
AGTTATGTAAAACGTG A230212d28_rd256: goodness_of_fit
ATAAAGAATCCCTTGA A230212d28_rd256: goodness_of_fit
ATCGAAAAAACTGCAA A230212d28_rd256: goodness_of_fit
ATTTATATTGTCGAAC A230212d28_rd256: goodness_of_fit
CAAGACAAGCCCTATA A230212d28_rd256: goodness_of_fit
CACCTTCATCCTAAAG A230212d28_rd256: goodness_of_fit
CACGTTAGTGAGACTT A230212d28_rd256: goodness_of_fit
CAGTAGCAAAACATGC A230212d28_rd256: goodness_of_fit
CAGTGCCATCCATCCA A230212d28_rd256: goodness_of_fit
CCAATAAAATACGATG A230212d28_rd256: goodness_of_fit
CCAATCATGTATCACA A230212d28_rd256: goodness_of_fit
CCCATATACTCACAGA A230212d28_rd256: goodness_of_fit
CCGCTATCATTAACCC A230212d28_rd256: goodness_of_fit
CCGGTTTTCGGGACCT A230212d28_rd256: goodness_of_fit
CGATCTTTACGAAAAA A230212d28_rd256: goodness_of_fit
CGCCGAACGGCGGCGC A230212d28_rd256: goodness_of_fit
CGCGAACAACAGGGGA A230212d28_rd256: goodness_of_fit
CGCGAATCACTAAGTA A230212d28_rd256: goodness_of_fit
CGTATAACTGACGATT A230212d28_rd256: goodness_of_fit
CTACACTACATCAAAT A230212d28_rd256: goodness_of_fit
CTACTAGAGCAGCGAG A230212d28_rd256: goodness_of_fit
CTATCTTAATCTACAG A230212d28_rd256: goodness_of_fit
CTCATTACAGAAATTG A230212d28_rd256: goodness_of_fit
CTGTGAAAAAAAATAC A230212d28_rd256: goodness_of_fit
CTTCATCTCATTTAAA A230212d28_rd256: goodness_of_fit
CTTGAATACACAAACA A230212d28_rd256: goodness_of_fit
GAAAGAAAGCTATATG A230212d28_rd256: goodness_of_fit
GACAGAAACAAAATTA A230212d28_rd256: goodness_of_fit
GACCAAAGCTGCAGGG A230212d28_rd256: goodness_of_fit
GAGATAGCCCAGAGGT A230212d28_rd256: goodness_of_fit
GCAACGAGGTGTAACC A230212d28_rd256: goodness_of_fit
GCATTATAATCTTGTG A230212d28_rd256: goodness_of_fit
GCCGTAGCGAAATCTT A230212d28_rd256: goodness_of_fit
GCTAATTCCAAAAGCG A230212d28_rd256: goodness_of_fit
GCTGAAGACAGTATTA A230212d28_rd256: goodness_of_fit
GCTTTTGAGAACCATT A230212d28_rd256: goodness_of_fit
GGGTGCAATGAATCCA A230212d28_rd256: goodness_of_fit
GGTTGCGTAGTTAATC A230212d28_rd256: goodness_of_fit
GTAGAAACTAGGAGTT A230212d28_rd256: goodness_of_fit
GTTATTATGACTTCAT A230212d28_rd256: goodness_of_fit
GTTTTTCACTGAGTAG A230212d28_rd256: goodness_of_fit
TACCATTTTGGTCCGC A230212d28_rd256: goodness_of_fit
TACGAAAATCAAGAGC A230212d28_rd256: goodness_of_fit
TACGACGGAAACAGAA A230212d28_rd256: goodness_of_fit
TAGCTGGGCAAAGGCT A230212d28_rd256: goodness_of_fit
TAGTTGCCCCGACCTG A230212d28_rd256: goodness_of_fit
TATCGCAATATGATAA A230212d28_rd256: goodness_of_fit
TATTATCTAAACGGCG A230212d28_rd256: goodness_of_fit
TCAAACTATGATATTC A230212d28_rd256: goodness_of_fit
TCAACCCTTCGATGTA A230212d28_rd256: goodness_of_fit
TCAATGAATGCGGGGT A230212d28_rd256: goodness_of_fit
TCCAAACAGCGTTAAA A230212d28_rd256: goodness_of_fit
TCCCGAACTGAACGCG A230212d28_rd256: goodness_of_fit
TCCTTTAACTAATCGA A230212d28_rd256: goodness_of_fit
TCGCGGTAGATTTGCG A230212d28_rd256: goodness_of_fit
TCGTCCTAGAACCTAA A230212d28_rd256: goodness_of_fit
TCTTAACTACCCGATG A230212d28_rd256: goodness_of_fit
TGAGATCAGCCGGGTG A230212d28_rd256: goodness_of_fit
TGGCTAGCGCACACCA A230212d28_rd256: goodness_of_fit
TTACGTCAATGTTTGA A230212d28_rd256: goodness_of_fit
TTAGCAGTTAACGTAT A230212d28_rd256: goodness_of_fit
TTAGTCATCTGGGTGC A230212d28_rd256: goodness_of_fit
TTATAATGGCCGGTAT A230212d28_rd256: goodness_of_fit
TTTACTCGACTAACCG A230212d28_rd256: goodness_of_fit
TTTATGCCGATAGAGA A230212d28_rd256: goodness_of_fit
serum_replicates: {}